関連するActiveObject
モデルが2つあります。
class Product < ActiveRecord::Base
belongs_to :product_type
#contains a field called name
end
class ProductType < ActiveRecord::Base
has_many :products
# contains a field called name
end
それらの関係を使用して両方のモデルを結合すると、すべてうまく機能します。
Product.joins(:product_type)
"SELECT \"products\"。*FROM\" products \ "INNER JOIN \" product_types \ "ON \"product_types\"。\"id\ "= \"products\"。\"product_type_id\" "
しかし、今度は特定の製品を取得する必要がありますProductType
。製品タイプはその名前です(各製品タイプの名前は一意です)。そのため、Railsガイドが示唆しているように、結合されたテーブルの条件を使用してみました。 :
Product.joins(:product_type).where(:product_type => {:name => "MyProductTypeUniqueName"})
これにより、次のSQLが生成されます。
"SELECT \"products\".* FROM \"products\" INNER JOIN \"product_types\" ON \"product_types\".\"id\" = \"products\".\"product_type_id\" WHERE \"product_type\".\"name\" = 'MyProductTypeUniqueName'"
残念ながら、次のエラーで失敗します。
ActiveRecord :: StatementInvalid:PG :: Error:ERROR:Missing FROM-clause entry for table "product_type"
SQLの生成時にproduct_type列がFROM句に含まれていないため、エラーが発生しているようです(少なくとも「product_type.name」列は含まれていません)。
PostgreSQLとRailsの使用3.2.3SQLの結果は、返されたオブジェクトインスタンスのto_sql
メソッドを使用して提供されますActiveRecord::Relation
SQL文字列を直接提供して結合できることは知っていますが、これはレールガイドの例とほぼ同じ例であるため、機能するはずです。私は何が間違っているのですか?
編集:両方のモデルには、「名前」というフィールドが含まれています。これがSQLが正しく構築されていない理由である場合に含まれます。