如何向此 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 条件?的主要内容,如果未能解决你的问题,请参考以下文章

如何向此功能添加开始按钮?

如何向此 Vega 可视化添加图例

如何使用 jQuery 向此页面添加背景图像?

从 Mongoose Find() 查询向对象数组添加属性 [重复]

从 Mongoose Find() 查询向对象数组添加属性 [重复]

将附加条件附加到查询