我在这里看过关于自我参照关系的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)

注意:代码未测试-您可能需要修正…

10-06 08:12