我有一個包含項目的表格和一個包含項目特徵的表格。 對應機種: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。
有人有類似的問題http://stackoverflow.com/questions/29375627/rails-query-join-association-table-with-alias/29392498#29392498 – RPinel 2015-04-03 20:16:44