ActiveRecord Many-To-Many Self Join
系统中有一个 User
模型,要求用户之间需要存在一个朋友关系,即:每个人有可以拥有多个朋友:
1 | current_user.friends.push << user1 << user2 |
步骤:
(1). 首先创建一个用于存储朋友关系的表:
1 | class CreateFriendships < ActiveRecord::Migration |
(2). 修改 User
模型:
1 | class User < ActiveRecord::Base |
(3). 添加 Friendship
模型:
1 | class Friendship < ActiveRecord::Base |
实际上,步骤 (2)
和 (3)
还可以简化为:
1 | class User < ActiveRecord::Base |
到目前为止已经可以实现了在用户之间建立朋友关系,但是上面实现的这个关联是单方向的:当把张三设置为李四的朋友(lisi.friends << zhangsan)之后,李四并不会出现在张三的朋友集合(zhangsan.friends)中,我没有找到能很好地实现此种需求的关联设置方案,但是从 RailsCasts(见下面参考部分的链接)里找到一个替代方案。实施方法如下:
修改 User
模型如下即可:
1 | class User < ActiveRecord::Base |
此时,当将张三添加到李四的朋友集合中(lisi.friends << zhangsan
)后,那么李四就会出现
zhangsan.inverse_friends
集合中
参考: