On Monday, November 19, 2012 6:26:28 AM UTC-8, Stefan Rohlfing wrote:
>
> Hi,
>
> As part of implementing a Twitter clone I am trying to model a friendship
> association using Sequel,
> where two users are called friends if A follows B and B also follows A.
> This is the code I came up with so far :
>
> DB.create_table? :users do
> String :nickname, :size => 20, :primary_key => true
> String :email, :size => 255, :null => false
> String :description, :size => 255, :null => false
> end
>
> DB.create_table? :relationships do
> foreign_key :user_id, :users, :key => :nickname, :type => String,
> :on_update => :cascade, :on_delete => :cascade
> foreign_key :follower_id, :users, :key => :nickname, :type => String,
> :on_update => :cascade, :on_delete => :cascade
> primary_key [:user_id, :follower_id]
> end
>
> class User < Sequel::Model
> many_to_many :followers,
> :class => self, :join_table => :relationships,
> :left_key => :user_id, :right_key => :follower_id
> many_to_many :follows,
> :class => self, :join_table => :relationships,
> :right_key => :user_id, :left_key => :follower_id
> # Friendship relation: A follows B and B follows A
> many_to_many :friends
> end
>
> User.unrestrict_primary_key
>
> user = User.find(:nickname => "me") || User.create(:nickname => "me")
> p user.followers
> # SELECT "users".* FROM "users"
> # INNER JOIN "relationships"
> # ON (("relationships"."follower_id" = "users"."nickname")
> # AND ("relationships"."user_id" = 'me')) # why not use 'WHERE' here?
>
Well, in this particular query there is no difference. INNER JOIN
conditions are processed the same as WHERE conditions. This is just an
implementation detail.
>
> p user.follows
> # SELECT "users".* FROM "users"
> # INNER JOIN "relationships"
> # ON (("relationships"."user_id" = "users"."nickname")
> # AND ("relationships"."follower_id" = 'me'))
>
> Here is a gist of all tables and
> associations<https://gist.github.com/4110827>of this Twitter clone.
>
> As I am quite new to both Sequel and relational databases, I would be glad
> if someone could help me answer the following questions:
>
> - Does the above code follow Sequel's 'best practices' or is there
> something I could improve?
>
> This looks fine other than the friends implementation.
>
> - How can I express the many_to_many :friends association in Sequel?
>
>
You probably don't want to add friends as an association. I would use a
simple method:
class User < Sequel::Model
def friends
follows & followers
end
end
since friends appears to be the intersection of follows and followers.
Thanks,
Jeremy
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/sequel-talk/-/dtuMBS1qOsAJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sequel-talk?hl=en.