0

動作しているように見えるコードがあります。希望する仕事を達成するためのもっと良い方法があるかもしれないと思います。問題は、パラメーターのリストが不明な 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

VAT または National Id がモデルでスコープされているため、これらが指定されている場合は Country が必要です。

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
4

1 に答える 1

3

Arel を利用できます。たとえば、次のように記述します。

posts = Post.where(author_id: 12)

postsこのクエリは、反復を開始するか、または呼び出しを開始しない限り実行されませんposts.all。したがって、次のように書くことができます。

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

  posts
end

この簡単な例は、探している動作を実現する方法を示しています。

于 2013-07-08T17:15:32.740 に答える