SQLite использует 1 для true и 0 для false :
SQLite не имеет отдельного класса логического хранилища. Вместо этого логические значения хранятся в виде целых чисел 0 (ложь) и 1 (истина).
Но SQLite также имеет свободную систему типов и автоматически преобразует данные, поэтому ваш 'f'
, вероятно, интерпретируется как имеющий истинность "true" просто потому, что он не равен нулю.
Небольшое копание указывает на то, что вы обнаружили ошибку в Rails 3.0.7 SQLiteAdapter. В active_record/connection_adapters/abstract/quoting.rb
мы находим это:
def quoted_true
"'t'"
end
def quoted_false
"'f'"
end
Таким образом, по умолчанию ActiveRecord предполагает, что база данных понимает 't'
и '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
или quoted_false
, поэтому он получает значения по умолчанию, которые не работают с логическими значениями SQLite.
Булевы 't'
и 'f'
работают в PostgreSQL, поэтому, возможно, все используют PostgreSQL с Rails 3, или они просто не замечают, что их запросы не работают должным образом.
Я немного удивлен этим, и, надеюсь, кто-то может указать, где я ошибся, вы не можете быть первым, кто использует логический столбец в SQLite с Rails 3.
Попробуйте обезьянько патчить def quoted_true;'1';end
и def quoted_false;'0';end
в ActiveRecord::ConnectionAdapters::SQLiteAdapter
(или временно отредактируйте их в active_record/connection_adapters/sqlite_adapter.rb
) и посмотрите, получите ли вы разумный SQL.