ruby on rails-ActiveRecord::Statement无效的SQLite3::SQLExceptio



我希望@messages返回@folder.messages,其中列"deleted"的值不等于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  

SQLite使用C风格的布尔值:

SQLite没有单独的布尔存储类。相反,布尔值存储为整数0(false(和1(true(。

所以,当你这么说的时候:

deleted != true

SQLite不知道true是什么,所以它假设您正在尝试引用另一个列名。

处理这个问题的正确方法是让AR将Ruby布尔值转换为SQLite布尔值(如Tam和fl00r的回答(。不过,我认为知道自己做错了什么是有用的。

更新:如果你想检查非真deleted并包括NULL,那么你会想要这个:

@ms = @msgs.where("deleted != ? OR deleted IS NULL", true)

或者更好的是,根本不允许在deleted中使用NULL。除非万不得已,否则不应该允许NULL为任何列(ActiveRecord默认的可为NULL性与它应该为的完全相反(。SQL NULL是一个奇怪的野兽,你总是必须特别对待它,最好不要允许它,除非你需要一个"不存在"或"未指定"的列值。

@ms = @msgs.where("deleted != ?", true) 
# OR
@ms = @msgs.where(:deleted => false) 

CCD_ 4对于不同的数据库是不同的。在某些情况下,它是t/f值,而在某些情况中是true/false值,因此您应该或将其放在引号中,并确保它是否适合您的特定数据库,或者您应该将其从sql中排除,以便Rails为您完成任务。

UPD

如果CCD_ 7是CCD_。首先默认情况下,将已删除字段设置为false。第二,如何使用AR:找到它

@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])

相关内容

  • 没有找到相关文章

最新更新