ActiveRecord:: StatementInvalid SQLite3:: SQLException: нет такого столбца: true:
Я хочу иметь @messages return @ folder.сообщения, в которых значение столбца "удалено" не равно true. Я не уверен, почему это продолжает бросать SQLException. Наверное, я неправильно форматирую удаленный атрибут, но я не уверен, как его исправить.
любая помощь была бы весьма признательна. Спасибо заранее.
сообщение об ошибке:
ActiveRecord::StatementInvalid in MailboxController#index
SQLite3::SQLException: no such column: true: SELECT "message_copies".* FROM "message_copies" WHERE ("message_copies".folder_id = 1) AND (deleted != true)
Приложения Трассировки:
app/controllers/mailbox_controller.rb:14:in `show'
app/controllers/mailbox_controller.rb:5:in `index'
Mailbox_Controller.rb
1 class MailboxController < ApplicationController
2 def index
3 current_user = User.find(session[:user_id])
4 @folder = Folder.where("user_id = #{current_user.id}").first
5 show
6 render :action => "show"
7 end
8
9 def show
10 current_user = User.find(session[:user_id])
11 @folder = Folder.where("user_id = #{current_user.id}").first
12 @msgs = @folder.messages
13 @ms = @msgs.where("deleted != true")
14 @messages = @ms.all.paginate :per_page => 10,
15 :page => params[:page], :include => :message,
16 :order => "messages.created_at DESC"
17 end
18 end
3 ответов
SQLite использует C-style логические значения:
SQLite не имеет отдельного логического класса хранения. Вместо этого логические значения хранятся в виде целых чисел 0 (false) и 1 (true).
поэтому, когда вы говорите это:
deleted != true
SQLite не знает, что true
поэтому предполагается, что вы пытаетесь ссылаться на другое имя столбца.
правильный способ справиться с этим-позволить AR преобразовать ваш Ruby boolean в SQLite boolean (как в ответах Tam и fl00r). Я думаю, что полезно знать, что вы делаете неправильно.
обновление: если вы хотите проверить на ложь deleted
и включите NULL, тогда вы захотите этого:
@ms = @msgs.where("deleted != ? OR deleted IS NULL", true)
или лучше, не позволяйте NULLs в deleted
на всех. Вы не должны позволять NULL-это любой столбец, если вы абсолютно не должны (значение по умолчанию ActiveRecord для nullability точно противоположно тому, что должно быть). SQL NULL-странный зверь, и вы всегда нужно относиться к нему специально, лучше не допускать его, если вам не нужно значение "не существует" или "не указано" для столбца.
@ms = @msgs.where("deleted != ?", true)
# OR
@ms = @msgs.where(:deleted => false)
true
разная для разных баз данных. В некоторых это t/f
значение, а в некоторых true/false
, поэтому вы должны или поместить его в кавычки и убедиться, что он подходит для вашей конкретной базы данных, или вы должны исключить его из своего sql, чтобы Rails выполнял эту работу за вас.
UPD
если deleted
is NULL
. Первый. установить удаленное поле как false по умолчанию. Во-вторых, как найти его с АР:
@ms = @msgs.where("deleted = ? OR deleted = ?", false, nil)
# wich won't work, Thanks to @mu is too short
@ms = @msgs.where("deleted = ? OR deleted IS NULL", false)