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

标签 ruby-on-rails postgresql 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 且颜色为“棕色”的商品?

更新: 实际上,以上代码都不起作用。第一个不会产生 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/

相关文章:

ruby-on-rails - 在单个 Heroku Cedar 应用程序中同时部署 Rails 和 Node.js

ruby-on-rails - 在惯用的 ActiveRecord 中查找或创建唯一的关联对象?

postgresql - 如何在 SQLite 和 PostgreSQL 中获得相同的日期?

java - ($Proxy6) org.postgresql.jdbc4.Jdbc4Connection@5894585b,这是什么意思?

python - ProgrammingError,Flask with postgres 和 sqlalchemy

ruby-on-rails - 在 respond_with 散列中包含一个虚拟属性

javascript - Dropzonejs rails 不呈现 js.erb 文件

ruby-on-rails - 尝试使用 Rails 创建数据库时出错,rake db :create

ruby-on-rails - rails 中的 Active Admin - csv 限制

mysql - AR 获取自己的帖子和 friend 的帖子