gpt4 book ai didi

ruby-on-rails - Activerecord:为表使用别名时出现类型错误

转载 作者:行者123 更新时间:2023-11-29 12:20:20 25 4
gpt4 key购买 nike

我有一个包含项目的表和一个包含项目特征的表。对应机型:

    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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com