Rails モデルで、start_date と end_date でフィルタリングする named_scope を達成しようとしています。かんたんだよ。しかし、私は多くの異なる分野で多くの機会にそれをしなければなりません.
これはトラブルを求めていますか?もしそうなら、なぜ(SQLインジェクション?)これを達成する別の方法がありますか。
named_scope :between, lambda {|start_date, end_date, field|
{ :conditions => ["#{field} >= ? AND #{field} <= ?", start_date, end_date] }
}
編集:使用されるソリューション
私が行った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 インジェクションを回避したりできます。今後のインプット。