Railsモデルでは、start_dateとend_dateをフィルタリングするnamed_scopeを適用しようとしています。かんたんだよ。しかし、私は多くの場面でたくさんの異なる分野でそれをやらなければなりません。named_scopeの変数フィールド名?
これは問題を尋ねていますか?もしそうなら、なぜ(SQLインジェクション?)これを達成する別の方法があります。
named_scope :between, lambda {|start_date, end_date, field|
{ :conditions => ["#{field} >= ? AND #{field} <= ?", start_date, end_date] }
}
EDIT:思考のEggdropののラインを使用して
を使用する溶液私は一緒に行きました:
@@valid_fields = %w(fields in here)
named_scope :between, lambda{ |start_date, end_date, field_name|
field = (@@valid_fields.include?(field_name)) ? (field_name) : raise (ActiveRecord::StatementInvalid)
{ :conditions => ["#{field} >= ? AND #{field} <= ?", start_date, end_date]}
}
今、私は基本的に書き換えることなく、私は日付範囲でフィルタするフィールドのための私のnamed_scopeを再利用することができます同じスコープを何度も繰り返し、フィールド名をホワイトリストに入れて、カラム名やトリックなSQLインジェクションを回避してください。テーブルxが、その後、「フィールド」は、そのテーブル内の特定の既存の日付フィールドでなければならない場合
:
現在フィールドホワイトリストを使用しており、フィールドがこれに含まれていない場合は例外が発生します。 – nitecoder
はい、私たちは同じことを話していると思います。 – eggdrop
クール、それは他の誰かが私にも提案したことです。今は最高の道のようだ。ありがとう:) – nitecoder