在 Rails 模型中,我试图实现一个在 start_date 和 end_date 上过滤的 named_scope。这很简单。但我将不得不在很多不同的领域多次这样做。
这是自找麻烦吗?如果是这样,为什么(SQL 注入(inject)?)还有另一种方法可以实现这一目标。
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 注入(inject)将来会暴露给用户输入。
最佳答案
也许您可以在您的模型中编写一个方法来验证“字段”:
如果表 x,则“字段”必须是该表中特定的现有日期字段。
换句话说,您不允许外部输入直接进入“字段”——外部输入必须映射到您的验证方法中指定的已知属性和定义条件。
不过,总的来说,似乎不推荐这个总体方向。
关于ruby-on-rails - named_scope 中的变量字段名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/908832/