2016-12-21 9 views
0

Я пытаюсь реализовать простую поисковую систему в приложении Rails5.Составить SQL-запросы

В принципе, у меня есть несколько полей в форме, и мне нужно получить все записи, соответствующие всем входным значениям. Обратите внимание, что все значения являются необязательными.

Значения, которые я могу найти, - 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)) } 

или подобного, но я не могу заставить его работать.

Любые предложения?

Thanks

+0

То, что отсутствовало в моем решении, возвращало отношение. 'methods.grep (/ _ condition $ /). Inject (Employee) do | klass, condition | klass = klass.where (отправить (условие)) end' – macsig

ответ

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 

К сожалению, не смог проверить это, но он должен работать

+0

К сожалению, предложение 'where' всегда одно и то же. Что-то просто равное, иногда мне нужно сопоставить регулярное выражение, мне нужно проверить, находится ли значение в диапазоне. То, что я хочу сделать, - это определить методы N '_condition' и пропустить их через них. – macsig

0

Ваш пример будет работать но вам необходимо разместить пункт where об ассоциации:

methods.grep(/_condition$/).each do |condition| 
    association = association.where(send(condition)) 
end 
+0

Спасибо за ответ. Что такое 'ассоциация'? BTW Код выше не работает. – macsig

+0

Ассоциация - это область, к которой вы пытаетесь применить фильтры. Например, 'Employee.all' – vegetaras

+0

Ok. В любом случае я решил это, как описано в моем комментарии выше. Хороший 1 – macsig

 Смежные вопросы

  • Нет связанных вопросов^_^