我正在 Rails 中创建一个小型社交网络,人们可以在其中将彼此添加为朋友。我创建了一个名为 的模型'user'
,其中包含电子邮件、带有密码盐的强 md5 哈希等。
如何创建类似于将另一个用户添加为朋友的选项?是否有可能has_many_and_belongs_to :user
在用户模型中有类似的东西?所以一个用户有很多用户,属于很多用户。或者我应该使用另一种方式,比如添加一个有user1s_id:integer
和的友谊模型user2s_id:integer
?
我正在 Rails 中创建一个小型社交网络,人们可以在其中将彼此添加为朋友。我创建了一个名为 的模型'user'
,其中包含电子邮件、带有密码盐的强 md5 哈希等。
如何创建类似于将另一个用户添加为朋友的选项?是否有可能has_many_and_belongs_to :user
在用户模型中有类似的东西?所以一个用户有很多用户,属于很多用户。或者我应该使用另一种方式,比如添加一个有user1s_id:integer
和的友谊模型user2s_id:integer
?
本质上,您需要一个将用户连接到用户的连接模型。但是您必须对 Rails 使用更具描述性的术语。
Twitter 不使用 Rails,但这里是他们的用户关联如何使用 Twitter 的术语在 Rails 中工作。注意:Twitter 不需要双向关注(即仅仅因为一个用户关注另一个用户,并不意味着第二个用户关注第一个用户)
class User < ActiveRecord::Base
has_many :followings
has_many :followers, :through => :followings, :class_name => "User"
has_many :followees, :through => :followings, :class_name => "User"
end
class Following < ActiveRecord::Base
# fields: follower_id followee_id (person being followed)
belongs_to :follower, :class_name => "User"
belongs_to :followee, :class_name => "User"
end
强制双向友谊(如 Facebook 强制我不能和你成为朋友,除非你和我是朋友)需要更多的工作。您将需要使用回调管理互惠条目,或者使用自定义查找器 SQL。使用自定义查找器 SQL 意味着 ActiveRecord 可能无法为您管理关联。
我建议一个用户有很多关系,这将使您在未来可以自由地添加新类型的关系。
因此,您从“一个用户到另一个用户”关系表(至少只有两个 ID)开始,然后您可以添加一个“一个用户到一个组”关系表(当然,一旦您创建了组!)
我建议使用友谊模型,因为从数据库方面来说,无论哪种方式,您都需要一个连接表,但是使该表显式将允许您存储有关关系的更多详细信息(例如“朋友”或“家庭”,添加日期, ...)