我希望@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])