【问题标题】:Ruby on Rails: Adding another Or ClauseRuby on Rails:添加另一个 Or 子句
【发布时间】:2020-11-03 02:01:58
【问题描述】:

我正在使用 Ruby on Rails(Rails 版本 4.2)支持旧版应用程序。

我有一个搜索功能,我在用户界面上有一个搜索框。

有一个功能已经存在。

用户可以输入一个搜索词并提交搜索,在后端代码会在7列中搜索这个“搜索词”,并且它们都属于一个表(表“Tickets " 与模型 Ticket)

7 个列名存储在数组 Ticket::SEARCH_FIELDS 中 并且搜索将是所有 SQL “like”。

所以sql语句的WHERE子句会是

Select .... FROM Tickets WHERE (column1 like '%term%' or column2 like '%term%' or ....)

所以构建这个where子句的代码如下

query = Ticket.where(
   Ticket::SEARCH_FIELDS.map { |field| 
          ticket.arel_table[field].matches("%#{search_term}%") 
               }.inject(:or)
        )

代码运行良好。

但是有一项新要求是在这 7 列中再添加一列,但该列不是来自同一个表,而是来自名为 Employee 的查找表。

Ticket的Model定义中已经有两个模型之间的关联,如下:

class Ticket < ActiveRecord::Base
         belongs_to :employee

所以,我想在前面的 where 子句中添加另一个带有该列的 OR 子句,如下所示:

WHERE column1 like '%term%' .... OR employees.name like '%term%'

我尝试了几次,但没有任何成功。

非常感谢任何帮助

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activerecord


    【解决方案1】:

    这适用于 Rails 6。应该也适用于 4.2 版。

    query1 = Ticket.joins(:employee).where(
       Ticket::SEARCH_FIELDS.map { |field| 
              ticket.arel_table[field].matches("%#{search_term}%") 
                   }.inject(:or)
            )
    
    query2 = Ticket.joins(:employee).where(Employee.arel_table[name].matches("%#{search_term}%"))
    
    query1.or(query2)
    

    编辑:

    虽然 Rails 4.2 不支持 or,但您可以使用诸如 https://github.com/Eric-Guo/where-or 之类的反向移植库来获得相同的功能。

    【讨论】:

    • 两个查询之间的“或”在 4.2 上不起作用。收到错误:NoMethodError - #<:relation> 的未定义方法“或”
    • 添加了一个库,可用于将 or 功能反向移植到 Rails 4.2
    【解决方案2】:

    我知道这是一个非常特殊的情况,很少有人会遇到。但我找到了解决方法:

    table_columns = Ticket::SEARCH_FIELDS.map { |field| 
          ticket.arel_table[field].matches("%#{search_term}%") 
    employee_column = Employee.areal_table[:name].matches("%#{search_term}%")
    table_columns.append(employee_column)
    query = Ticket.joins("LEFT OUTER JOIN employees on tickets.employee_id = employees.id").where (table_columns.inject(:or))
    

    【讨论】:

      猜你喜欢
      • 2011-02-11
      • 2016-03-10
      • 1970-01-01
      • 2023-01-29
      • 2017-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      相关资源
      最近更新 更多