【问题标题】:What is the "Rails Way" of doing a query with an OR clause using ActiveRecord?使用 ActiveRecord 使用 OR 子句进行查询的“Rails 方式”是什么?
【发布时间】:2012-04-14 13:04:28
【问题描述】:

我正在使用带有 MySQL 数据库的 Rails 3,我需要以编程方式创建这样的查询:

select * from table where category_name like '%category_name_1%' 
OR category_name like '%category_name_2%'
(...snip...)
OR category_name like '%category_name_n%'

考虑到表的大小和项目范围(我认为最多 500 行),我觉得使用像 think sphinx 这样的东西会有点过头了。 我知道我可以通过直接编写查询字符串来简单地做到这一点,但想知道是否有 ActiveRecord 方法来做到这一点。 official guide 上没有提到这一点,我已经在谷歌上搜索了很长时间,只是空手而归:(

另外,是否有理由(可能是 Rails 的原因?)不包含 OR 子句?

谢谢!

【问题讨论】:

  • 我不确定您的意思是什么,您所在的指南中没有提及。第 2.2 节包含一个非常相似的示例(用 'and' 代替 'or' 和 '=' 代替 'like')。
  • 没错,但请看我在下面对您的评论的回复...

标签: mysql ruby-on-rails ruby activerecord ruby-on-rails-3.2


【解决方案1】:

假设您有一个带有类别名称的数组names

Model.where( names.map{"category_name LIKE ?"}.join(" OR "),
  *names.map{|n| "%#{n}%" } )

【讨论】:

  • 这就像一个魅力。对您的示例稍作修改:Model.where(names.map{"category_name LIKE ?"}.join(" OR "), *names.map{|n|"%#{n}%"})... "n" 周围的 #{ } 丢失了
【解决方案2】:

你应该先谷歌,已经有答案了。 查看here,然后查看here 你会得到这样的东西:

accounts = Account.arel_table
Account.where(accounts[:name].matches("%#{user_name}%").or(accounts[:name].matches("%#{user_name2}%")))

【讨论】:

    【解决方案3】:

    如果您查看指南,他们的示例可以轻松修改为:

    Client.where("orders_count = ? OR locked = ?", params[:orders], false)
    

    【讨论】:

    • 如果您想在特定条件后向查询中添加另一个 OR 子句怎么办?例如,除了orders_count 和locked,你想添加类似OR id_number = ?
    • Client.where("orders_count = ? OR locked = ? OR id_number = ?", params[:orders], false, id) (?????)
    • 我的意思是如何以编程方式添加第三个(或第四个) OR ,而不仅仅是更改查询字符串...
    • 啊,在那种情况下你会想使用.or
    【解决方案4】:

    假设您的类别名称中没有正则表达式元字符,Mysql 现在有一个正则表达式函数可以稍微清理一下:

    Table.where "category_name regexp '#{names.join('|')}'"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多