2010-11-19 6 views
115

私はRailsの3で、この検索持っている:Rails 3の検索で日付の比較を行うことはできますか?

Note.where(:user_id => current_user.id, :notetype => p[:note_type], :date => p[:date]).order('date ASC, created_at ASC') 

をしかし、私は:date => p[:date]条件が:date > p[:date]にequivilentする必要があります。これどうやってするの?読んでくれてありがとう。

答えて

203
Note. 
    where(:user_id => current_user.id, :notetype => p[:note_type]). 
    where("date > ?", p[:date]). 
    order('date ASC, created_at ASC') 

またはあなたはまた、あなたが列名があいまいな問題をヒットした場合、あなたが行うことができますSQL表記

Note. 
    where("user_id = ? AND notetype = ? AND date > ?", current_user.id, p[:note_type], p[:date]). 
    order('date ASC, created_at ASC') 
+2

は、安全ですか?私は、p [:date]がユーザーの入力から来た場合、SQLインジェクションを引き起こすことができますか? – MhdSyrwan

+7

'where()'のために安全です。 'where()'を使うと自動的に入力をエスケープします。 –

+25

Simoneのコメントは完全に真実ではありません。 'where()'は、変数の代わりに疑問符をつけた上記の形式で、入力を自動的にエスケープします。後で関数呼び出しでリストされます。 'Note.where(" date>#{p [:date]} ")' – bdx

58

にすべてを変換することができます:

date_field = Note.arel_table[:date] 
Note.where(user_id: current_user.id, notetype: p[:note_type]). 
    where(date_field.gt(p[:date])). 
    order(date_field.asc(), Note.arel_table[:created_at].asc()) 
+2

なんらかの理由で、SimoneのPostgreSQLサーバで "where"メソッドを使用してカラムが見つからないというエラーが発生しましたが、SQLiteで動作していました。あなたの方法は両方で働いていました。 – plackemacher

+1

Arelのドキュメントは次のとおりです:https://github.com/rails/arel –

関連する問題