所以我有一个模型User
和Friends
。
问题是我希望user.friends
显示所有朋友,无论用户是用户B还是用户B是否为A。
我以为我可以创造这样的东西
友 belongs_to:用户 belongs_to:user
所以它将是用户之间的简单连接表,但我可以很容易地看到这是不可能的。
我可以创建包含2列id_a,id_b的表,然后在模型中创建has_many :friends, :through=> :id_a or :id_b
答案 0 :(得分:0)
如果您想使用联接表执行此操作,则可以使用列Friendships
和friend_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
的朋友。