Rails像条件一样分页

时间:2014-04-16 14:53:40

标签: ruby-on-rails-3 paginate

我想根据用户输入过滤我的paginate返回值。但用户输入并不总是精确的。因此,我不必使用=比较,而是使用like。我的第一次尝试是

Person.paginate :page => params[:page], :conditions => ["name like '%?%'", entered_name]

但结果查询为where name like '%'my_user_input'%'。这是一个无效的查询。

以下查询返回我想要实现的内容,但它打开了SQL注入的漏洞。

Person.paginate :page => params[:page], :conditions => ["name like '%#{entered_name}%'"]

结果查询为where name like '%my_user_input%'

问题是:如何在不产生此安全问题的情况下使用类似条件?

我使用的是rails 3.0.20。

1 个答案:

答案 0 :(得分:1)

ActiveRecord在matches上支持处理转义的Arel::Table方法。

在您的情况下,您可以使用

Person.where(Person.arel_table[:name].matches("%#{params[:entered_name]}%")).
  paginate(page: params[:page])

并将安全处理留给ActiveRecord。