我有一个包含项目的表和一个包含项目特征的表。 对应机型:
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 且颜色为“棕色”的商品?
更新: 实际上,以上代码都不起作用。第一个不会产生 SQL 错误,但它做了错误的事情。它只是引用值,所以它变成了字符串。 IE。
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 代替。
最佳答案
试试这个:
Item.joins(:characteristics).where(characteristics: [{name: 'price', value: '100'},{name: 'weight', value: '50'}] )
关于ruby-on-rails - Activerecord:为表使用别名时出现类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29438474/