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

3番目のモデルでは、変数のペアを使用して条件を設定しようとしています。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は、少なくともRails 3.0の時点では、動的変数をActiveRecordの関連付け条件に渡すための秘訣です。単に呼び出す:

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 に答える