我有兩個相關的ActiveObject
型號:Rails3中加入不包括加入colums
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時不包括在FROM子句中(至少'product_type.name'列不是)
使用PostgreSQL和Rails使用的ActiveRecord::Relation
對象實例to_sql
方法提供3.2.3 SQL結果返回
我知道我可以做一個直接連接提供了SQL字符串,但這應該工作,因爲它是一個例子幾乎等於在導軌指南¿任何想法我做錯了什麼?
編輯:這兩種模式都包含一個名爲'名稱'的字段。包含在這種情況下是SQL無法正確構建的原因。
不工作。 product_type是belongs_to關聯,因此必須單數 –
@RickyAH您的表名不是單數,它的複數形式必須是:product_types – shweta
表名的部分很有洞察力,而且我得到了它的工作。 我認爲在where子句中:product_types引用*關係*而不是*表名*(或者,更具體地說,我認爲ActiveRecord會根據給定關係推斷正確的表名)。不幸的是,'product_types'不是表的名字(是爲rails引擎創建的表,所以它真的是'refinery_product_types'),這增加了更多的混淆。 請編輯您的答案並指定:product_types必須是TABLE的名稱,我很樂意接受它。 謝謝@shweta –