7

@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  
4

3 に答える 3

20

SQLite は C スタイルのブール値を使用します。

SQLite には、別個の Boolean ストレージ クラスはありません。代わりに、ブール値は整数 0 (偽) および 1 (真) として格納されます。

だから、あなたがこれを言うとき:

deleted != true

SQLite は何が何でtrueあるかを認識していないため、別の列名を参照しようとしていると想定します。

これに対処する適切な方法は、AR に Ruby ブール値を SQLite ブール値に変換させることです (Tam と fl00r の回答のように)。ただし、何が間違っているのかを知ることは有用だと思います。

UPDATE : true でないことを確認してdeletedNULL を含めたい場合は、次のようにします。

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

または、NULL をまったく許可しない方がよいでしょうdeleted。絶対に必要な場合を除き、NULL を任意の列に許可しないでください (ActiveRecord の null 可能性のデフォルトは、本来あるべきものとは正反対です)。SQL NULL は奇妙な獣であり、常に特別に扱う必要があります。列に「そこにない」または「指定されていない」値が必要でない限り、許可しないのが最善です。

于 2011-04-24T03:05:37.493 に答える
3
@ms = @msgs.where("deleted != ?", true) 
# OR
@ms = @msgs.where(:deleted => false) 

trueデータベースごとに異なります。t/f値である場合true/falseもあれば、 である場合もあるため、引用符で囲み、特定のデータベースに適しているかどうかを確認するか、SQL から除外して、Rails が作業を行うようにする必要があります。

UPD

deletedの場合NULL。初め。削除されたフィールドをデフォルトで 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)
于 2011-04-24T02:58:01.250 に答える
0

試す

@ms = @msgs.where(["deleted != ?",true])
于 2011-04-24T02:58:51.130 に答える