私は書くだろう:
objects = Something.where(params.slice(:one, :two))
ノート:
通常、空のパラメーターも存在しないと見なされます。この場合: Something.where(params.slice(:one, :two).select { |k, v| v.present? })
.
奇妙に見えるかもしれませんが、あなたのスニペットでは と書くべきです。Rubyobject = if ...
はステートメントではなく条件式である言語であるというのは、はるかに慣用的です。
all
no-op として呼び出さないでください。ActiveRecord::Relation
もう (クールな) はありませんが、Array
(それほどクールではない) はありません。where({})
完全に問題ありません。
ネーミングはとても重要です!「単一要素」と考える場合object
(ここでは当てはまりません)、objects
「コレクション」と考える場合。
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 })