撰写SQL查询

时间:2016-12-21 18:03:14

标签: ruby-on-rails arel

我试图在Rails5应用上实现一个简单的搜索引擎。

基本上,我在表单中有几个字段,我需要获取所有匹配所有输入值的记录。请注意,所有值都是可选的。

我可以搜索的值是namedescriptioncreated_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)) }

或类似但我无法使其发挥作用。

有什么建议吗?

由于

2 个答案:

答案 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