【问题标题】:Multiple like conditions in active record活动记录中的多个类似条件
【发布时间】:2013-04-22 12:28:52
【问题描述】:

我需要根据多个类似的语句检查我的记录,最好的方法是什么?即

names = ['alice', 'bob', 'mark']

我有一个表格,可以说我的数据库中的 People 或 (Peoples),所以我想选择所有名字如上述 3 的人。

找到了这个答案:

https://stackoverflow.com/a/5333281/169277

对于使用 like 但我不知道如何传递值数组而不是单个值。有什么想法吗?

更新:

我需要喜欢,因为人们有两个名字

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    有许多插件可以提供这种查询,但您真正需要的是Arel

    您需要使用类似的方法为 LIKE 准备查询参数

    wildcard_names = names.collect { |name| "%#{name}%" } # => ["%alice%","%bob%","%mark%"]
    

    那么你就使用了 Arel 的 #matches_any 方法。

    people_table = People.arel_table
    People.where(people_table[:name].matches_any(wildcard_names))
    

    正如 PriteshJ 所说,添加 to_sql 以确认查询正确。

    【讨论】:

    • 请注意:在较大的数据集上,前导通配符可能会导致性能问题。
    【解决方案2】:

    试试这个

    names = ['alice', 'bob', 'mark']
    Person.where('name REGEXP ?',names.join('|'))
    

    在与单个列上的多个值匹配时,您可以使用REGEXP 而不是LIKE 这将生成一个带有 in 子句的 sql 语句

    要检查生成的 sql,只需添加 .to_sql

    Person.where('name REGEXP ?',names.join('|')).to_sql
    

    【讨论】:

    • 我需要喜欢,因为有人可以有两个名字,而这两个名字之一不是中间名
    【解决方案3】:

    这会起作用。
    Person.where('name SIMILAR TO ?',"(alice|bob|mark)")

    也可以进行高级匹配
    Person.where('name SIMILAR TO ?',"%(alice|bob|mark)%")
    如果名称是“jon alice”,即正则表达式匹配,上述行也将起作用。

    参考 postgresql 文档:http://www.postgresql.org/docs/9.0/static/functions-matching.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 2020-01-26
      相关资源
      最近更新 更多