Activerecord:为表使用别名时出现类型错误

时间:2015-04-03 19:28:48

标签: ruby-on-rails postgresql activerecord

我有一个包含项目的表格和一个包含项目特征的表格。 相应的型号:

    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。

2 个答案:

答案 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上执行此操作,但这是一个不同的问题