2

我正在为客户建立一个 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一个仅包含用户的数组;如果不是,则返回一个空数组。

有人有建议吗?

4

1 回答 1

0

看起来这是正确的格式:

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 => :followed, :source => :follower, :uniq => true

对于 Rails 新手来说,这:uniq => true很重要(正如我在执行此操作时发现的那样),因为它可以防止has_many X, :through => Y关系返回重复项(也就是说,没有它,您可能会得到多个不同的对象,每个对象都有自己的对象 ID,都引用相同的记录/排)。

于 2013-01-18T18:14:28.390 回答