我正在嘗試將我的代碼從ActiveRecord 3升級到ActiveRecord 4,並且我相信我在ActiveRecord + SQLite3的布爾查詢支持中遇到了一個錯誤/迴歸。ActiveRecord 4中的迴歸+ 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和Sqlite3,因爲我使用內存中的SQLite3數據庫運行我的rspec測試,我相信這是在Ruby世界中的一個常見設置。因爲SQlite3是內存中的,所以沒有什麼可以「修復」。在嘗試調試這個問題之前,我以前從未交換過1/true。 – esilver
這可能是常見的,但它仍然是一個壞主意(與Rails默認SQLite一樣糟糕,還是他們修復了第4版中的愚蠢行爲?),因爲數據庫可移植性是一個神話。 AR喜歡假裝它完全隱藏數據庫,但事實並非如此;考慮一些簡單的東西,比如在SQLite的一個'varchar(5)'中插入一個長度爲10的字符串(整個事情進去),MySQL(截斷爲5或者根據服務器配置得到一個異常)和PostgreSQL(異常來自數據庫)。不,驗證不會拯救你。 –