2

我有以下型号:

class Publication < ActiveRecord::Base
  has_many :reviews
  has_many :users, :through => :owned_publications
  has_many :owned_publications
end

class User < ActiveRecord::Base
  has_many :publications, :through => :owned_publications
  has_many :owned_publications
end

class OwnedPublication < ActiveRecord::Base
  belongs_to :publication
  belongs_to :user
  has_one :review, :conditions => "user_id = #{self.user.id} AND publication_id = #{self.publication.id}"
end

在第三个模型中,我试图用一对变量设置一个条件。语法似乎有效,只是 self 不是 OwnedPublication 的实例。是否可以获取 OwnedPublication 的当前实例并将其置于条件中?

4

2 回答 2

4

该解决方案需要使用 :through 和 :source 选项,以及 proc 调用:

has_one :review, :through => :publication, :source => :reviews,
  :conditions => proc { ["user_id = ?", self.user_id] }

Proc 是将动态变量传递给 ActiveRecord 关联条件的技巧,至少从 Rails 3.0 开始。简单地调用:

has_one :conditions => proc { ["publication_id = ? AND user_id = ?",
  self.publication_id, self.user_id] }

不过,这行不通。这是因为该关联最终会在评论表中搜索“reviews.owned_publication_id”列,该列不存在。相反,您可以使用发布的 :reviews 关联作为来源,通过发布找到正确的评论。

于 2013-01-30T15:37:58.823 回答
1

我认为您最好的选择是让评论记录属于 OwnedPublication,并设置您的发布模型以通过以下方法获取评论:

def reviews
  review_objects = [] 
  owned_publications.each do |op|
    review_objects << op
  end
  review_objects
end

如果您使用子查询来获取信息,这可能是一种更有效的方式,但它消除了具有不必要关联的概念。

于 2013-01-28T19:40:59.103 回答