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)

попробовать

@ms = @msgs.where(["deleted != ?",true])