ruby-on-rails - named_scope 中的变量字段名称?

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

在 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/

相关文章:

ruby-on-rails -::ModuleName::ClassName 和 ModuleName::ClassName 有什么区别

ruby-on-rails - 保存验证部分失败的模型

ruby - 如何使用数组中的键初始化散列?

ruby-on-rails - 模型知道参数哈希 - Rails 反模式?

php - 寻求有关在 CodeIgniter 中加入查询的帮助

ruby-on-rails - 构建 Rails ActiveRecord where 子句

mysql - 与 ActiveRecord 和 Sinatra 的多维 JOIN

ruby-on-rails - 部署到 Heroku:ExecJS::RuntimeError: SyntaxError: Unexpected token

ruby-on-rails - 语法错误,启动 Sidekiq 后出现意外的 keywords_end

ruby-on-rails - JRuby可以使用原始的Ruby gem 吗?