SQLite использует C-стиль логические значения :
SQLite не имеет отдельного класса логического хранения.Вместо этого логические значения сохраняются как целые числа 0 (ложь) и 1 (истина).
Итак, когда вы говорите это:
deleted != true
SQLite не знает, что true
предполагает, что вы пытаетесь сослаться на имя другого столбца.
Правильный способ справиться с этим - позволить AR преобразовать ваш логический Ruby в логический SQLite (как в ответах Тэма и Флота).Я думаю, что полезно знать, что вы делаете неправильно.
ОБНОВЛЕНИЕ : Если вы хотите проверить неверное значение deleted
и включить NULL, то вам нужно это:
@ms = @msgs.where("deleted != ? OR deleted IS NULL", true)
Или, что лучше, вообще не разрешать NULL в deleted
.Вы не должны допускать, чтобы NULL был любым столбцом, за исключением случаев, когда это абсолютно необходимо (значение по умолчанию для ActiveRecord для обнуляемости в точности противоположно тому, что должно быть).SQL NULL - странный зверь, и вы всегда должны обращаться с ним особым образом, лучше не допускать его, если вам не нужно значение «не там» или «не указано» для столбца.