我有一个包含项目的表格和一个包含项目特征的表格。 相应的型号:
class Characteristic < ActiveRecord::Base
belongs_to :item
end
class Item < ActiveRecord::Base
has_many :characteristics
end
每个特征都有它的名称(即“价格”),价值,对项目的引用。 我需要按多个特征选择项目,比如,price = 100和weight = 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:decimal {8,2}来保存特征的数值。我还添加了
after_validation do
self.value_f = value.to_f
end
到特色的模型。因此,当我想将值与数字进行比较时,我只使用value_f。
答案 0 :(得分:1)
试试这个:
Item.joins(:characteristics).where(characteristics: [{name: 'price', value: '100'},{name: 'weight', value: '50'}] )
答案 1 :(得分:0)
找到解决方案: Postgresql. CREATE CAST 'character varying' to 'integer'
CREATE CAST (varchar AS integer) WITH INOUT AS IMPLICIT;
仍然要弄清楚如何在Heroku上执行此操作,但这是一个不同的问题