我有这样的代码结构:
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中的两个可选参数用于过滤要进行的查询。这可以更干净吗?
答案 0 :(得分:2)
我写道:
objects = Something.where(params.slice(:one, :two))
注意:
通常,空参数也被视为不存在。在这种情况下:Something.where(params.slice(:one, :two).select { |k, v| v.present? })
。
看起来很奇怪,在你的代码片段中你应该写object = if ...
,它更像是一种习惯用语,其中条件是表达式而不是语句。
不要将all
称为无操作,您再没有ActiveRecord::Relation
(很酷),而是Array
(不太酷)。 where({})
完全没问题。
命名非常重要!如果你看到object
你认为“单一元素”(这里不是这样),如果你看到objects
你认为是“集合”。
如果参数键与DB列不匹配:有很多方法可以做到,例如:
pairs = {:x => :db_x, :y => db_y}.map { |k, v| [v, params[k]] if params[k] }]
Something.where(Hash[pairs.compact])
或只是两个属性:
attrs = {:db_one => params[:one], :db_two => params[:two]}
Something.where(attrs.select { |k, v| v })
答案 1 :(得分:0)
你可能会考虑这样做(链接标准):
object = Something.all
object = object.where(:one => params[:one]) if params[:one]
object = object.where(:two => params[:two]) if params[:two]