2013-08-06 1 views
0

필터링 기능의 파이프 라인에 ActivRecord :: Relation을 전달하는 복잡한 ActiveRecord 쿼리를 작성하고 있습니다. 그들 중 하나는 일련의 "또는"연결된 조건을 추가해야합니다. ActiveRecord :: Relation은 #or 메서드를 제공하지 않으므로 #where로 전달할 SQL 문자열을 작성하고 있습니다. 이 문자열은 동적으로 생성되므로 실제로 사용할 수 없습니까? 값. 이전 질문에서 준비된 문을 사용하는 것이 쿼리를 만드는 가장 좋은 방법이라는 것을 알고 있지만 여기에 적용 할 방법을 찾을 수 없습니다.준비된 문을 사용할 수없는 ActiveRecord에서 이스케이프 문자열

문자열을 이스케이프 처리하거나 준비된 명령문을 사용하여 변환하는 방법이 있습니까?

편집 :. 나는 이런 식으로 뭔가를 (방법은 액티브 :: 관계 객체로 항목을 수신

where_string = ''; 
filters.each do |field,value| 
    if(Item.column_names.include? field) 
    where_string += "OR" if where_string!='' 
    where_string += " #{field} LIKE '%#{value.to_s}%'" 
    end 
return items.where(where_string) 
+2

정확한 검색어를 입력하십시오. – user2801

+0

@ user2801 질문 샘플을 사용하여 질문을 수정했습니다. 전에 질문이 불분명 한 경우. – andreimarinescu

답변

1

다음
query_array = [] 
value_array = [] 
filters.each do |field,value| 
    if(Item.column_names.include? field) 
    query_array << "#{field} LIKE ?" 
    value_array << "%#{value.to_s}%" 
    end 
end 
value_array.insert(0, query_array.join(' OR ')) 
return Item.where(value_array) 
1

내가 그것을 할 것입니다 방법은 아래의 사용 시도하고 있어요 :

def filters_to_query(filters) 
    filters.inject(['']) do |query, field, value| 
    if Item.column_names.includes? field 
     query[0] << ' OR ' unless query[0].blank? 
     query[0] << "#{field} LIKE ?" 
     query << value 
    end 
    end 
end 

Item.where(filters_to_query filters) 
관련 문제