如何在Rails中为Friends创建关系模型?

时间:2015-10-05 19:18:13

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

所以我有一个模型UserFriends

问题是我希望user.friends显示所有朋友,无论用户是用户B还是用户B是否为A。

我以为我可以创造这样的东西

友   belongs_to:用户   belongs_to:user

所以它将是用户之间的简单连接表,但我可以很容易地看到这是不可能的。

我可以创建包含2列id_a,id_b的表,然后在模型中创建has_many :friends, :through=> :id_a or :id_b

1 个答案:

答案 0 :(得分:0)

如果您想使用联接表执行此操作,则可以使用列Friendshipsfriend_a_id创建friend_b_id并定义以下关系:

User

has_many(
  :a_friendships, 
  class_name: "Friendship", 
  foreign_key: :friend_a_id, 
  primary_key: :id
)
has_many(
  :b_friendships, 
  class_name: "Friendship", 
  foreign_key: :friend_b_id, 
  primary_key: :id
)
has_many :friend_as, through: :b_friendships, source: :friend_a
has_many :friend_bs, through: :a_friendships, source: :friend_b
def friends
  friend_as + friend_bs
end

Friendship

belongs_to :user
belongs_to(
  :friend_a, 
  class_name: "User", 
  foreign_key: friend_a_id, 
  primary_key: :id
)
belongs_to(
  :friend_b, 
  class_name: "User", 
  foreign_key: friend_b_id, 
  primary_key: :id
)
然后

user.friends将返回一个活动记录,其中包含属于包含该用户的友谊列表中的所有用户。这可以通过收集用户为friend_b的友谊中的所有friend_a来实现,反之亦然。

这假设您并不是说您拥有Friend模型,而是每个User可以成为另一个User的朋友。