2015-04-03 63 views
2

我有一個包含項目的表格和一個包含項目特徵的表格。 對應機種:Activerecord:爲表格使用別名時出現類型錯誤

class Characteristic < ActiveRecord::Base 
     belongs_to :item 
    end 

    class Item < ActiveRecord::Base 
     has_many :characteristics 
    end 

每個特性具有它的名字(即,「價格」),值,一個項目的一個參考。 我需要通過多個特性來選擇項目,比如價格= 100,重量= 50。對於這一點,我需要連接表的兩倍,這樣的:

Item.joins('INNER JOIN characteristics c1 ON c1.item_id = items.id'). 
    joins('INNER JOIN characteristics c2 ON c2.item_id = items.id'). 
    where('c1' => {name: 'price', value: '100'}, 
    'c2' => {name: 'weight', value: '50'}) 

,這就是問題的所在。特徵的值作爲字符串存儲在數據庫中,當我嘗試將其與整數或範圍進行比較時,我得到一個類型轉換錯誤。但是,當我不使用表的別名,沒有錯誤。 所以,下面的代碼工作:

Item.joins('INNER JOIN "characteristics" ON "characteristics"."item_id" = "items"."id"'). 
    where(characteristics: {characteristic_type_id: 223, value: 380}) 

但是這一次沒有:

Item.joins('INNER JOIN "characteristics" c1 ON c1."item_id" = "items"."id"'). 
    where(c1: {characteristic_type_id: 223, value: 380}) 

所以,我怎麼能選擇用,比如說項目,價格在50..100和顏色'布朗?

UPD: 實際上,上述代碼都不起作用。第一個不會產生SQL錯誤,但它做錯了事。它只是引用值,因此它變成了字符串。即

where(c1: {value: 10..15}) 

成爲

WHERE ("c1"."value" BETWEEN '10' AND '15') 

這是很明顯的,而不是我真正想要 所以我決定做一字段添加到特性,value_f:小數{8,2}持有的數值的特點。我還添加了

after_validation do 
     self.value_f = value.to_f 
    end 

到特徵的模型。所以,當我想將一個值與一個數字進行比較時,我只是使用了value_f。

+0

有人有類似的問題http://stackoverflow.com/questions/29375627/rails-query-join-association-table-with-alias/29392498#29392498 – RPinel 2015-04-03 20:16:44

回答

1

試試這個:

Item.joins(:characteristics).where(characteristics: [{name: 'price', value: '100'},{name: 'weight', value: '50'}]) 
+0

ActiveR ecord :: StatementInvalid:PG :: UndefinedColumn:ERROR:列items.item_id不存在 :SELECT「items」。* FROM「items」INNER JOIN「characteristics」ON「characteristics」。「item_id」=「items」。 「id」WHERE「items」。「item_id」IN('--- :characteristic_type_id:223 :value:''380'' ','--- :characteristic_type_id:222 :value:''11 ,0'' ')感覺就像我們需要用一些更合適的東西來替換「items」。「item_id」 – IvanSelivanov 2015-04-03 20:28:57

相關問題