我正在为客户建立一个 Rails 项目,他们希望用户(模型)能够相互关注(如在 Twitter 中)。他们还希望能够跟踪一个用户何时开始关注另一个用户。
由于我需要跟踪创建日期,我想,一个has_many X, :through => Y
关系将是要走的路,所以 Y 将跟踪它的创建日期。
我设置了关注模型:
class Follow < ActiveRecord::Base
attr_accessible :actor_id, :observer_id, :follower, :followee
attr_readonly :actor_id, :observer_id, :follower, :followee
belongs_to :follower, :class_name => 'User', :foreign_key => :observer_id
belongs_to :followee, :class_name => 'User', :foreign_key => :actor_id
validates_presence_of :follower, :followee
validates_uniqueness_of :actor_id, :scope => :observer_id
end
问题是如何在 User 模型中设置关系?
理想情况下,我希望它具有以下内容:
:follows
将是关联的 Follow 对象,其中 self 是关注者(observer_id):followed
将是关联的 Follow 对象,其中 self 是被关注者(actor_id):following
将是关联的用户对象,其中 self 是关注者(observer_id):followers
将是关联的用户对象,其中 self 是关注者(actor_id)
不过,我不确定如何编写这些has_many :through
部分?我应该使用:source => X
还是foreign_key => X
?我应该分别输入哪个键(actor_id 或observer_id)?
编辑:我目前正在这样做
has_many :follows, :foreign_key => :observer_id
has_many :followed, :class_name => 'Follow', :foreign_key => :actor_id
has_many :following, :class_name => 'User', :through => :follows, :source => :followee, :uniq => true
has_many :followers, :class_name => 'User', :through => :follows, :source => :follower, :uniq => true
它大部分都在工作。除了:followers
工作正常之外,所有这些都user.followers
在做一些奇怪的事情。似乎它正在检查用户是否正在关注某人,如果他们是则返回user.followers
一个仅包含用户的数组;如果不是,则返回一个空数组。
有人有建议吗?