【发布时间】:2014-01-30 17:26:07
【问题描述】:
我正在尝试将我的代码从 ActiveRecord 3 升级到 ActiveRecord 4,并且我相信我在 ActiveRecord + SQLite3 的布尔查询支持中遇到了错误/回归。
这是运行 ActiveRecord 4.0.2 的 IRB 会话的输出,其中 SQLite3 是数据库后端:
2.0.0p353 :040 > StoreItem.where(item_class: 1, enabled: 1).order(item_order: :desc).count
=> 4
2.0.0p353 :041 > StoreItem.where(item_class: 1, enabled: true).order(item_order: :desc).count
=> 0
作为一个比较点,当 Mysql 5.5 是数据库后端时,这里是相同的输出:
2.0.0p353 :005 > StoreItem.where(item_class: 1, enabled: 1).order(item_order: :desc).count
=> 4
2.0.0p353 :006 > StoreItem.where(item_class: 1, enabled: true).order(item_order: :desc).count
=> 4
现在,让我们看看使用 AR 3.2.14 运行时会发生什么:
SQLite3:
2.0.0p353 :005 > StoreItem.where(item_class: 1, enabled: 1).order(item_order: :desc).count
=> 0
2.0.0p353 :006 > StoreItem.where(item_class: 1, enabled: true).order(item_order: :desc).count
=> 4
Mysql 5.5:
2.0.0p353 :001 > StoreItem.where(item_class: 1, enabled: 1).order(item_order: :desc).count
=> 4
2.0.0p353 :002 > StoreItem.where(item_class: 1, enabled: true).order(item_order: :desc).count
=> 4
如您所见,当出现布尔查询时,ActiveRecord 3.2.14 和 4.0.2 在 SQLite3 中做完全相反的事情。
我刚刚检查了实际生成的 SQL,它是相同的。第一个查询如下所示:
SELECT COUNT(*) FROM "store_items" WHERE "store_items"."item_class" = 1 AND "store_items"."enabled" = 1
第二个是这样的:
SELECT COUNT(*) FROM "store_items" WHERE "store_items"."item_class" = 1 AND "store_items"."enabled" = 't'
因此,SQLite3 对布尔列值的处理可能从 1.3.5 到 1.3.8 发生了变化?
这是一个已知的错误,任何人都可以评论原因吗?
【问题讨论】:
标签: mysql sqlite activerecord ruby-on-rails-4 rails-activerecord