与变量的关系条件

时间:2013-01-28 19:34:21

标签: ruby-on-rails rails-activerecord

我有以下型号:

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的当前实例并将其置于某个条件中?

2 个答案:

答案 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

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