【发布时间】:2009-05-26 03:38:24
【问题描述】:
在 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 注入,如果代码曾经得到将来会暴露给用户输入。
【问题讨论】:
标签: ruby-on-rails ruby activerecord named-scope