SQLite 使用1 为真,0 为假 http://www.sqlite.org/datatype3.html#boolean:
SQLite 没有单独的布尔存储类。相反,布尔值存储为整数 0(假)和 1(真)。
但 SQLite 也有一个松散的类型系统,可以自动转换内容,因此您的'f'
可能仅仅因为它不为零而被解释为具有“真实”的真实性。
经过一番挖掘,您发现了 Rails 3.0.7 SQLiteAdapter 中的一个错误。在active_record/connection_adapters/abstract/quoting.rb
,我们发现这些:
def quoted_true
"'t'"
end
def quoted_false
"'f'"
end
因此,默认情况下,ActiveRecord 假设数据库能够理解't'
and 'f'
对于布尔列。 MySQL 适配器会覆盖这些以与其一起工作tinyint
布尔列的实现:
QUOTED_TRUE, QUOTED_FALSE = '1'.freeze, '0'.freeze
#...
def quoted_true
QUOTED_TRUE
end
def quoted_false
QUOTED_FALSE
end
但 SQLite 适配器不提供自己的实现quoted_true
or quoted_false
所以它得到的默认值不适用于 SQLite 的布尔值。
The 't'
and 'f'
布尔值在 PostgreSQL 中工作,所以也许每个人都在 Rails 3 中使用 PostgreSQL,或者他们只是没有注意到他们的查询无法正常工作。
我对此感到有点惊讶,希望有人能指出我哪里出了问题,你不可能是第一个在 Rails 3 中使用 SQLite 布尔列的人。
尝试猴子修补def quoted_true;'1';end
and def quoted_false;'0';end
into ActiveRecord::ConnectionAdapters::SQLiteAdapter
(或暂时将它们手动编辑为active_record/connection_adapters/sqlite_adapter.rb
),看看你是否得到了合理的 SQL。