作者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