0

次のようなコード構造があります。

if params[:one] && params[:two]
  object = Something.where(:one => params[:one], :two => params[:two])
elsif params[:one]
  object = Something.where(:one => params[:one])
elsif params[:two]
  object = Something.where(:two => params[:two])
else
  object = Something.all
end

基本的に、作成するクエリをフィルタリングする URL 内の 2 つのオプション パラメータ。これはよりきれいになりますか?

4

2 に答える 2

2

私は書くだろう:

objects = Something.where(params.slice(:one, :two))

ノート:

  1. 通常、空のパラメーターも存在しないと見なされます。この場合: Something.where(params.slice(:one, :two).select { |k, v| v.present? }).

  2. 奇妙に見えるかもしれませんが、あなたのスニペットでは と書くべきです。Rubyobject = if ...はステートメントではなく条件式である言語であるというのは、はるかに慣用的です。

  3. allno-op として呼び出さないでください。ActiveRecord::Relationもう (クールな) はありませんが、Array(それほどクールではない) はありません。where({})完全に問題ありません。

  4. ネーミングはとても重要です!「単一要素」と考える場合object(ここでは当てはまりません)、objects「コレクション」と考える場合。

  5. param キーが DB 列と一致しない場合: さまざまな方法があります。たとえば、次のようになります。

    pairs = {:x => :db_x, :y => db_y}.map { |k, v| [v, params[k]] if params[k] }]
    Something.where(Hash[pairs.compact])
    

または、2 つの属性だけです。

attrs = {:db_one => params[:one], :db_two => params[:two]}
Something.where(attrs.select { |k, v| v })
于 2012-12-10T20:48:46.233 に答える
0

あなたはそのようなことをすることを検討するかもしれません(連鎖基準):

object = Something.all
object = object.where(:one => params[:one]) if params[:one]
object = object.where(:two => params[:two]) if params[:two]
于 2012-12-10T20:55:20.420 に答える