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.

Reply via email to