我在这里看过关于自我参照关系的railscast:http://railscasts.com/episodes/163-self-referential-association
我在此基础上添加了一个关于友谊的“状态”字段,以便必须请求和接受友谊。status是一个布尔值——false表示尚未响应,true表示已接受。
我的问题是在给定当前用户(我正在使用devise)和另一个用户的情况下,找到友谊对象的方法。
以下是我能得到的:
current_user.friends # lists people you have friended
current_user.inverse_friends # lists people who have friended you
current_user.friendships # lists friendships you've created
current_user.inverse_friendships # lists friendships someone else has created with you
friendship.friend # returns friend in a friendship
我正在寻找一个类似于以下的方法,以便我可以很容易地检查友谊的状态:
current_user.friendships.with(user2).status
这是我的代码:
用户地址
has_many :friendships
has_many :friends, :through => :friendships
has_many :inverse_friendships, :class_name => "Friendship", :foreign_key => "friend_id"
has_many :inverse_friends, :through => :inverse_friendships, :source => :user
友谊.rb
belongs_to :user
belongs_to :friend, :class_name => "User"
当我在这里时——要显示用户的朋友,我必须同时显示“current_user.friends”和“current_user.inverse_friends”——有什么方法可以调用“current_user.friends”并将其作为两者的一个连接吗?
最佳答案
您可以将条件传递给给定的关联,从而:
has_many :friends, :class_name => 'User', :conditions => 'accepted IS TRUE AND (user = #{self.send(:id)} || friend = #{self.send(:id)})"'
注意:我们使用send,所以它在尝试提取属性之前不会计算属性。
如果您真的需要“.with(user2)”语法,那么您可以通过一个命名的范围来完成它,例如
Class Friendship
named_scope :with, lambda { |user_id|
{ :conditions => { :accepted => true, :friend_id => user_id } }
}
end
应允许:
user1.friendships.with(user2.id)
注意:代码未测试-您可能需要修正…