【问题标题】:Variable field name in named_scope?named_scope 中的变量字段名称?
【发布时间】: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


    【解决方案1】:

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

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

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

    不过,总的来说,似乎不建议采用这种总体方向。

    【讨论】:

    • 我目前正在考虑使用字段白名单,如果该字段不在此列表中,则会引发异常。
    • 是的,我想我们说的是同一件事。
    • 酷,这也是我与之交谈过的其他人的建议。似乎是目前最好的道路。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多