我有一个用户模型。
我有一个Friend Model,列为invitee_id、Invite_id和status。状态被用作朋友请求是否已被接受的标志。Inviter_id是发送好友请求的用户的id,invitee_id是接收好友请求的使用者。请检查内联注释。
class User < ActiveRecord::Base
has_many :friends // now i want to search all the friends with accepted friend request. (sent or received both.)
has_many :pending_friend_requests,:class_name => "Friend", :foreign_key=>"invitee_id", :conditions => {:status => 0}
end
class Friend < ActiveRecord::Base
end
问题是如何找到所有接受好友请求的好友。。发送或接收,因为存在两个外部列。invitee_id或Invite_id
如果我答对了你的问题,这个屏幕广播就是你需要的。
更新
尽管你说你没有,但我认为,你确实需要一种自我参照的多对多关系。您可以创建一个命名作用域,而不是为挂起的请求创建关联。之后,你可以得到User.find(params[:id]).friends.accepted
邀请的所有朋友。
我不明白的是,你是想让user.friends同时检索邀请我的人和我邀请的人,还是只检索其中一个。
由于你的名字(邀请人和被邀请人),我想这是第二种情况。它在放映中被覆盖了。这是通过创建额外的反向关联来完成的(Ryan最后谈到了这一点)。
但如果是第一个,最简单的解决方案是为每个邀请方-受邀方对排两行。你可以用这个宝石来简化事情,但它的作用和我说的一样。
如果没有帮助,试着具体说明你的问题。
has_many
设置关系。条件使用scope
。
class User < ActiveRecord::Base
has_many :invitees, :through => :friends
has_many :friends, :foreign_key=>"inviter_id"
def accepted_invitees
invitees.where(:friends => {:accepted => true })
end
end
class Friend < ActiveRecord::Base
belongs_to :invitee, :class_name => "User"
belongs_to :inviter, :class_name => "User"
# needs accepted column
end
然而,由于模型和列的设置方式,这会让人感到困惑。如果我这样做,我会做一些类似的事情:
class User < ActiveRecord::Base
has_many :friends, :through => :friendships
has_many :friendships
def accepted_friends
friends.where(:friendships => {:accepted => true })
end
end
class Friendships < ActiveRecord::Base
belongs_to :user # change inviter_id to user_id
belongs_to :friend, :class_name => "User" # change invitee_id to friend_id
# needs accepted column
end