2013-07-08 3 views
0

작동하는 것처럼 보이는 코드 조각이 있습니다. 나는 단지 원하는 일을 성취 할 훨씬 더 좋은 방법이있을 것이라고 생각한다. 문제는 알 수없는 매개 변수 목록을 사용하여 ActiveRecord 쿼리를 작성하는 것입니다.ActiveRecord 동적 쿼리 조건 빌드

query_string = String.new 
query_values = [] 
unless params[:organization][:name].blank? 
    query_string << 'name = ?' 
    query_values << params[:organization][:name] 
end 
unless params[:organization][:national_id].blank? && params[:organization][:vat_id].blank? 
    raise RequestParamsException.new('National ID or Vat ID given without country') if params[:organization][:country].nil? 
    country_id = Country.find_by_name(params[:organization][:country]).pluck(:id) 
    unless params[:organization][:national_id].blank? 
    query_string << ' OR ' unless query_string.empty? 
    query_string << '(national_id = ?' 
    query_values << params[:organization][:national_id] 
    query_string << ' AND ' << 'country_id = ?)' 
    query_values << country_id 
    end 
    unless params[:organization][:vat_id].blank? 
    query_string << ' OR ' unless query_string.empty? 
    query_string << '(vat_id = ?' 
    query_values << params[:organization][:vat_id] 
    query_string << ' AND ' << 'country_id = ?)' 
    query_values << country_id 
    end 
end 
known_organizations = query_string.blank? ? [] : Organization.where(query_string, query_values).uniq 

나라가 통 또는 주민등록번호가이가 모델 범위 때문에 주어진 때 필요하다 :

class Organization < ActiveRecord::Base  

#======================VALIDATIONS========================= 
    validates :national_id, :uniqueness => { :scope => :country_id }, :allow_blank => true 
    validates :vat_id, :uniqueness => { :scope => :country_id }, :allow_blank => true 
    validates :country, :presence => true 
end 

답변

3

당신은 Arel을 이용할 수 있습니다 여기에

는 코드입니다. 예를 들어, 당신은 쓸 때 : 당신이 posts에 반복 시작하거나 posts.all를 호출하지 않는 한

posts = Post.where(author_id: 12) 

이 쿼리가 실행되지 않습니다. 이 간단한 예를 들어 당신이 찾고있는 동작을 달성하는 방법을 보여줍니다

def search_posts 
    posts = Post.where(active: true) 
    posts = posts.where('body ilike ?', "%#{params[:query]%") unless params[:query].blank? 

    posts 
end 

: 그래서 당신이 뭔가를 쓸 수 있습니다.

+0

그건 어디서나 querys에 대해 잘 작동하지만 OR 연산자와 AND 연산자의 경우 OR 연산자를 추가해야하므로 더 많은 작업이 필요합니다. – muichkine