作者JohnDoe (不務正業)
看板Ruby
標題[RoR ] (地雷) ActiveRecord & Sqlite 對 boolean 的處理
時間Fri Sep 12 21:27:53 2008
# 環境
# OS: Windows XP
# Ruby 1.8.6
# Rails 2.1
# Sqlite 3.5.6
1. 先用 Migration 建立資料表,在 Sqlite3 看到的 schema 為:
CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"name" varchar(255) NOT NULL,
"alive" boolean NOT NULL);
2. 利用 sqlite3.exe 從外部檔案 load.sql 插入資料:
load.sql:
...
INSERT INTO users (name, alive) VALUES ('john', 'false');
INSERT INTO users (name, alive) VALUES ('bob', 'true');
INSERT INTO users (name, alive) VALUES ('robert', 'true');
...
3. 在 console 中列出所有的人:
>> User.find(:all)
=> [..., #<User id: 3, name: "john", alive: true>, ...]
4. 在 console 中列出還活著的人:
>> User.find(:all, :conditions => {:alive => true})
=> []
啥!!居然一個都沒有!!
後來找出問題出在哪邊已經是兩個小時後了 囧rz...
解答:
先是用 log 找出 ActiveRecord 轉換的 SQL 語法:
User.find(:all, :conditions => {:alive => true})
-> SELECT * FROM "users" WHERE ("users"."alive" =
't')
把同樣的句子放在 sqlite3.exe command line 下的確是查不到,
不過換成這樣就可以...... (真是讓人很無力阿~)
SELECT * FROM "users" WHERE ("users"."alive" =
'true')
結局:
把 load.sql 中的 'true' 改成 't',問題就很愉快(?)的解決了
--
有沒有人遇過類似機車的問題?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.233.128.40
2F:→ godfat:所以這邊 't' 確實不等同於 'true' ... @@ 09/12 21:50
3F:→ JohnDoe:終於知道原因了 多謝! 看來用sqlite自己皮要繃緊一點@_@ 09/13 00:42
4F:推 godfat:我也滿詫異會是這樣的原因... @_@ sqlite 看來確實不適合 09/13 00:51
5F:→ godfat:production, 或是不適合比較複雜的 application. 09/13 00:51