0

関連する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が正しく構築されていない理由である場合に含まれます。

4

1 に答える 1

0

これを試して、

Product.joins(:product_type).where(:table_name => {:name => "MyProductTypeUniqueName"})

ここで、:table_nameは、データベース内の:product_typeのテーブルの名前です。

于 2012-12-17T11:08:15.413 に答える