我有以下型号:
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的当前实例并将其置于某个条件中?
答案 0 :(得分: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”列,该列不存在。相反,您可以通过出版物找到正确的评论,使用出版物:评论协会作为来源。
答案 1 :(得分:1)
我认为您最好的选择是将审核记录归属于OwnedPublication,并设置您的出版物模型以通过方法获取评论:
def reviews
review_objects = []
owned_publications.each do |op|
review_objects << op
end
review_objects
end
如果您使用子查询来获取信息,那么可能是一种更有效的方法,但它会消除不必要关联的概念。