Ruby 在 Rails 上:添加另一个 Or 子句

Ruby on Rails: Adding another Or Clause

我在 Rails(Rails 版本 4.2)上使用 Ruby 支持遗留应用程序。

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

有一个功能已经存在。

用户可以输入一个搜索词并提交搜索,在后台代码会在7列中搜索这个“搜索词”,它们都属于一个table( table "Tickets" with the model Ticket)

7个列名存储在一个数组中Ticket::SEARCH_FIELDS 并且搜索将全部 SQL“喜欢”。

因此 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 列中再添加一列,但是该列不是来自同一个 table,而是来自名为 Employee 的查找 table。

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

class Ticket < ActiveRecord::Base
         belongs_to :employee

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

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

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

非常感谢任何帮助

这适用于 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 等向后移植库来获得相同的功能。

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

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))