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