简化if子句和记录检索

时间:2012-12-10 20:39:28

标签: ruby-on-rails ruby

我有这样的代码结构:

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 个答案:

答案 0 :(得分:2)

我写道:

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

注意:

  1. 通常,空参数也被视为不存在。在这种情况下:Something.where(params.slice(:one, :two).select { |k, v| v.present? })

  2. 看起来很奇怪,在你的代码片段中你应该写object = if ...,它更像是一种习惯用语,其中条件是表达式而不是语句。

  3. 不要将all称为无操作,您再没有ActiveRecord::Relation(很酷),而是Array(不太酷)。 where({})完全没问题。

  4. 命名非常重要!如果你看到object你认为“单一元素”(这里不是这样),如果你看到objects你认为是“集合”。

  5. 如果参数键与DB列不匹配:有很多方法可以做到,例如:

    pairs = {:x => :db_x, :y => db_y}.map { |k, v| [v, params[k]] if params[k] }]
    Something.where(Hash[pairs.compact])
    
  6. 或只是两个属性:

    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]