Ruby on rails RubyonRails:检索给定两个用户的友谊

Ruby on rails RubyonRails:检索给定两个用户的友谊,ruby-on-rails,ruby,relationship,self-reference,Ruby On Rails,Ruby,Relationship,Self Reference,我在这里见过railscast关于自我参照关系的文章: 在此基础上,我加入了一个关于友谊的“状态”字段,以便必须请求和接受友谊status'是一个布尔值-false表示尚未响应,true表示已接受 我的问题是,考虑到我正在使用Desive的当前用户和另一个用户,如何找到一个友谊对象 以下是我可以得到的: current_user.friends # lists people you have friended current_user.inverse_friends

我在这里见过railscast关于自我参照关系的文章:

在此基础上,我加入了一个关于友谊的“状态”字段,以便必须请求和接受友谊status'是一个布尔值-false表示尚未响应,true表示已接受

我的问题是,考虑到我正在使用Desive的当前用户和另一个用户,如何找到一个友谊对象

以下是我可以得到的:

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
我希望得到一种类似于以下的方法,以便我可以轻松地检查友谊的状态:

这是我的密码: user.rb

友谊网

belongs_to :user
belongs_to :friend, :class_name => "User"

当我使用它时-要显示用户的朋友,我必须同时显示当前的\u user.friends和当前的\u user.inverse\u friends-是否有任何方法可以调用当前的\u user.friends并使其成为两者的一个连接?

您可以将条件传递给给定的关联,因此:

has_many :friends, :class_name => 'User', :conditions => 'accepted IS TRUE AND (user = #{self.send(:id)} || friend = #{self.send(:id)})"'
注意:我们使用send,因此它在尝试提取属性之前不会计算属性

如果您真的需要.withuser2语法,那么您可以通过一个命名的\u作用域来实现

Class Friendship
  named_scope :with, lambda { |user_id|
      { :conditions => { :accepted => true, :friend_id => user_id } }
    }
end
应允许:

user1.friendships.with(user2.id)

注意:代码未经测试-您可能需要修复错误…

为什么不让友谊成为一种方向中立的关系,这种关系可以是接受的,也可以是拒绝的?一旦一段友谊被接受了,它真的与最初发起它的人有关吗?@Andrew,那将是理想的-我确实想保留谁邀请谁,但是这样发送者可以取消/接收者可以接受/拒绝。我很想知道如何做到这一点,但不幸的是,它没有回答主要问题。你找到答案了吗?我的回答有用吗?如果没有-你能在这里发布解决方案作为答案吗?我在运行你的简化关联时遇到问题:has_many:friends,:class_name=>User,:conditions=>'User_id={self.send:id}| friends_id={self.send:id}。我在执行user.friends时遇到的错误是:ActiveRecord::StatementInvalid:SQLite3::SQLException:没有这样的列:user\u id:选择users.*来自users.id=3和user\u id=3的用户| | friends\u id=3,如我所说-未测试。您需要更新它以适应您自己的实现并修复它。我猜您的用户模型使用不同的列名来表示这些。。。或者,您必须指定它是friendships.user\u id等
Class Friendship
  named_scope :with, lambda { |user_id|
      { :conditions => { :accepted => true, :friend_id => user_id } }
    }
end
user1.friendships.with(user2.id)