我试图在Rails5应用上实现一个简单的搜索引擎。
基本上,我在表单中有几个字段,我需要获取所有匹配所有输入值的记录。请注意,所有值都是可选的。
我可以搜索的值是name
,description
,created_at
。
我的想法是为每个值创建一个子句,然后将它们连接在一起。
class EmployeeSearch < ApplicationRecord
self.table_name = 'employees'
def results
# MAGIC HAPPENS HERE
end
private
def table
Employee.arel_table
end
def name_condition
table[:name].eq(name)
end
def description_condition
table[:description].matches("%#{description}%") unless description.blank?
end
def created_at_condition
...
end
end
EmployeeSearch.new(name: 'John Doe', created_at: '01/01/2010')
现在,我如何循环遍历results
中的所有条件并将每个条件链接到where
子句?
我在想像
这样的东西methods.grep(/_condition$/).map { |c| where(send(c)) }
或类似但我无法使其发挥作用。
有什么建议吗?
由于
答案 0 :(得分:0)
是的,请使用链接。我会将过滤器字段放在一个数组中,例如filter[name]
然后你可以这样做:
@employees = Employee
if params[:filter]
params[:filter].each do |f_name, f_value|
next if f_value.blank?
@employees = @employees.where(f_name => f_value)
end
end
抱歉无法测试,但应该可以使用
答案 1 :(得分:0)
您的示例可行但您需要在关联上放置where
子句:
methods.grep(/_condition$/).each do |condition|
association = association.where(send(condition))
end