在 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 注入造成任何混乱将来输入。