如何向此 Find 数组添加 LIKE 条件?
Posted
技术标签:
【中文标题】如何向此 Find 数组添加 LIKE 条件?【英文标题】:How do I add a LIKE condition to this Find array? 【发布时间】:2014-02-02 02:48:02 【问题描述】:提前感谢您的帮助。我正在按照我在此处找到的示例 (Rails Find when some params will be blank) 并尝试为搜索表单组合一堆条件。这是针对 Rails 2.3 遗留应用程序的。以下对我有用,但我不知道除了“=”之外如何做任何事情。例如,如何使programs_offered_category 条件成为LIKE 语句?我试过做
majorcategories = params[:majorcategories]
上面的条件语句和添加
conditions['programs_offered_category LIKE ?', "%#majorcategories%"]
但我得到“错误数量的参数(2 比 1)”。另外,我怎样才能在这个设置中做大于和小于符号?谢谢!
search_controller.rb
conditions =
conditions[:city] = params[:city] unless params[:city].blank?
conditions[:state] = params[:state] unless params[:state].blank?
conditions[:geo_region] = params[:geo_region] unless params[:geo_region].blank?
conditions[:size_category] = params[:size_category] unless params[:size_category].blank?
conditions[:programs_offered_category] = params[:majorcategories]
@location_matches = Masterlocation.find(:all, :conditions => conditions, :order => 'nickname ASC').paginate(:page => params[:page], :per_page => 20)
【问题讨论】:
【参考方案1】:我建议如下使用正则表达式
conditions['programs_offered_category'].map |k,v| (k =~ /majorcategories/) ? v : nil
如果有多个匹配则返回结果数组,否则返回单个值
【讨论】:
感谢您的回复!你能告诉我为什么我的当前代码会收到 2-for-1 错误,以及为什么我不能使用我正在尝试的方法吗?另外,上述内容是否能正确防止 SQL 注入?最后,我将如何在此设置和 AND 语句中使用大于号和小于号? 引发2-for-1
错误,因为 conditions
散列只需要一个值作为参数,但您发送 2。然后像您一样直接调用 SQL 函数(LIKE、AND、大于和小于)正在努力做。您可以添加一些自定义函数来操作 SQL 结果。
对不起,我不熟悉 REGEX。这是 LIKE 语句的工作方式:conditions['programs_offered_category'].map |k,v| (k=~ /majorcategories/) LIKE ?' v : nil
另外,这种方法是否可以防止 SQL 注入?
不保证,但是在构建条件散列后,您将调用 ORM 方法find
,因此,使用 ORM 比不使用更安全。它们允许您避免手动构建 SQL 查询。
嗯.. 保护它免受 SQL 注入非常重要(这就是我要修改搜索表单的原因。)是否有另一种更简单的方法来构建这些条件?以上是关于如何向此 Find 数组添加 LIKE 条件?的主要内容,如果未能解决你的问题,请参考以下文章
从 Mongoose Find() 查询向对象数组添加属性 [重复]