named_scope中的变量字段名称?

时间:2009-05-26 03:38:24

标签: ruby-on-rails ruby activerecord named-scope

在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注入将来接触用户输入。

1 个答案:

答案 0 :(得分:4)

也许您可以在模型中编写一个方法来验证“字段”:

如果是表x,则“field”必须是该表中特定的现有日期字段。

换句话说,您不允许直接在“字段”中输入外部输入 - 外部输入必须映射到验证方法中指定的已知属性和已定义条件。

但总的来说,似乎不推荐这个整体方向。