25

has_many :through 関係で結合された 2 つのモデルがあります。

class Publication < ActiveRecord::Base
  has_many :publication_contributors
  has_many :contributors, :through => :publication_contributors
end

class Contributor < ActiveRecord::Base
  has_many :publication_contributors
  has_many :publications, :through => :publication_contributors
end

class PublicationContributor < ActiveRecord::Base
  belongs_to :publication
  belongs_to :contributor
end

(私の PublicationContributor モデルで珍しく重要なことは、データベース ID のペアだけでなく、contributor_type という文字列属性も持っていることです。この文字列には、「作成者」、「翻訳者」、「発行者」などの役割を含めることができます。これがここでの問題だとは思いませんが、解決策はまだそれを説明する必要があります.)

次のような特定の貢献者がいる出版物を見つけたいです。

Publication
  .joins(:publication_contributors =>  :contributor)
  .where(:publication_contributors => 
            {:contributor_type => "Author", 
             :contributor => {:name => params[:authors]}})

ネストされた :contributor に到達するまで、すべてが正常に機能します。その時点で、SQL が飛び散ります。

Mysql2::Error: Unknown column 'publication_contributors.contributor' in 'where clause'

それは、publication_contributors.contributor_id を探すのではなく、存在しない publication_contributors.contributor を探しています。コードで何か間違ったことをしていますか? このように深くネストされた関連付けを持つ where 句の他の例は見つかりません。もしかしたら、それさえも不可能ですか?

アップデート:

生成された SQL

←[1m←[35mPublication Load (0.0ms)←[0m  SELECT `publications`.* FROM `publicati
ons` INNER JOIN `publication_contributors` ON `publication_contributors`.`public
ation_id` = `publications`.`id` INNER JOIN `contributors` ON `contributors`.`id`
 = `publication_contributors`.`contributor_id` WHERE `publication_contributors`.
`contributor_type` = 'Author' AND `publication_contributors`.`contributor` = '--
-\n:name:\n- Marilynne Robinson\n' LIMIT 1

また、Publications モデルに次の関連付けがあります。

has_many :authors, :through => :publication_contributors, :source => :contributor, :conditions => {:publication_contributors => {:contributor_type => "Author"}}

私はこれを行うことができると考えていました:

Publication.joins(:authors).where(:authors => {:name => params[:authors]})

しかし、それはエラーをスローします:

Mysql2::Error: Unknown column 'authors.name' in 'where clause'
4

1 に答える 1

46

where句を変更してみてください:

Publication
  .joins( :publication_contributors => :contributor )
  .where( :publication_contributors => {:contributor_type => "Author"}, 
          :contributors             => {:name => params[:authors]} ) 

ActiveRecord api は、ここではあまり一貫性がありません。 の引数は、 の引数とwhereまったく同じには機能しませんjoins。これは、do の引数が基礎となる SQL を反映していないjoinsのに対し、 doの引数は do を反映しているためです。where

whereキーがテーブル名で、値がハッシュ (それ自体が列名をキーとして持つ) であるハッシュを受け入れます。2 つのテーブルで同じ名前を持つ列を対象とするときのあいまいさを防ぐだけです。

これは、2 番目の問題が発生する理由も説明しています。関係authorsが存在しません。

于 2013-01-25T18:50:42.123 に答える