2016-12-21 5 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 절에 각각의 모든 조건을 통해 I 루프?

나는

methods.grep(/_condition$/).map { |c| where(send(c)) } 

또는 이와 유사한 같은 것을 생각하지만 난 그것이 작동 할 수 없습니다.

제안 사항?

감사합니다.

+0

내 솔루션에서 누락 된 것이 관계를 반환하고있었습니다. 'methods.grep (/ _ condition $ /). 주사 (직원) do | klass, condition | klass = klass.where (send (condition)) end' – macsig

답변

0

예.이 작업에는 연결을 사용하십시오.

가 는
@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

귀하의 예를 작동 것이다 : 나는 당신이 이런 일을 할 수있는 예를 다음 filter[name]

를 들어, 배열에서 필터 필드를 둘 것 당신은 협회에 where 절을 넣어야합니다 :

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

답변 해 주셔서 감사합니다. '협회 '란 무엇입니까? BTW 위의 코드는 작동하지 않습니다. – macsig

+0

연관은 필터를 적용하려는 범위입니다. 예 :'Employee.all' – vegetaras

+0

예. 어쨌든 위의 내 의견에 설명 된대로 해결했습니다. 좋은 1을 가라. – macsig