2013-07-08 100 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

您可以阿雷爾的優勢。例如,當你寫的:除非你開始迭代上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

對於.where查詢很適合,但對於OR和AND操作符來說,它似乎需要更多的工作,因爲如果某個位置在其之前,只應添加OR運算符。 – muichkine