3

Rails 2.3.8を使用して開発しており、検索条件を作成するためのより良い方法を探しています。

検索ページでは、ユーザーが検索条件を設定するユーザー検索のように、検索条件はユーザーが選択した条件(年齢、国、郵便番号など)によって異なります。

複数の検索条件を設定するために、以下のコードを記述しました。

# Add condition if params post.
conditions_array = []
conditions_array << ['age > ?', params[:age_over]] if params[:age_over].present?
conditions_array << ['country = ?', params[:country]] if params[:country].present?
conditions_array << ['zip_code = ?', params[:zip_code]] if params[:zip_code].present?

# Build condition
i = 0
conditions = Array.new
columns = ''
conditions_array.each do |key, val|
  key = " AND #{key}" if i > 0
  columns += key
  item_master_conditions[i] = val
  i += 1
end
conditions.unshift(columns)
# condiitons => ['age > ? AND country = ? AND zip_code = ?', params[:age], params[country], prams[:zip_code]]

@users = User.find(:all, 
  :conditions => conditions
)

このコードは正常に機能しますが、見苦しく、賢くありません。検索条件を作成するためのより良い方法はありますか?

4

2 に答える 2

2

名前付きスコープは、SQL インジェクションを防ぎながら、かさばりますが、もう少し読みやすくすることができます。

named_scope :age_over, lambda { |age|
  if !age.blank?
    { :conditions => ['age > ?', age] }
  else
    {}
  end
}

named_scope :country, lambda { |country|
  if !country.blank?
    { :conditions => ['country = ?', age] }
  else
    {}
  end
}

named_scope :zip_code, lambda { |zip_code|
  if !zip_code.blank?
    { :conditions => ['zip_code = ?', age] }
  else
    {}
  end
}

そして、検索を行うときは、それらを簡単に連鎖させることができます。

@user = User.age_over(params[:age_over]).country(params[:country]).zip_code(params[:zip_code])
于 2013-10-30T22:49:47.130 に答える
1

私は誤ってあなたの質問に出くわしました。それは古いものでさえ、答えは次のとおりです。

条件を定義したら、次のように使用できます。

# Add condition if params post.
conditions_array = []
conditions_array << ["age > #{params[:age_over]}"] if params[:age_over].present?
conditions_array << ["country = #{params[:country]}"] if params[:country].present?
conditions_array << ["zip_code = #{params[:zip_code]}"] if params[:zip_code].present?

conditions = conditions_array.join(" AND ")
@users = User.find(:all, :conditions => conditions) #Rails 2.3.8
@users = User.where(conditions) #Rails 3+
于 2013-06-14T07:39:02.917 に答える