2012-12-17 73 views
0

我有兩個相關的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無法正確構建的原因。

回答

0

試試這個,

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

其中:table_name是表的名稱:產品類型在DATABSE

+0

不工作。 product_type是belongs_to關聯,因此必須單數 –

+1

@RickyAH您的表名不是單數,它的複數形式必須是:product_types – shweta

+1

表名的部分很有洞察力,而且我得到了它的工作。 我認爲在where子句中:product_types引用*關係*而不是*表名*(或者,更具體地說,我認爲ActiveRecord會根據給定關係推斷正確的表名)。不幸的是,'product_types'不是表的名字(是爲rails引擎創建的表,所以它真的是'refinery_product_types'),這增加了更多的混淆。 請編輯您的答案並指定:product_types必須是TABLE的名稱,我很樂意接受它。 謝謝@shweta –