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 中的两个可选参数用于过滤要进行的查询。这可以更清洁吗?

4

2 回答 2

2

我会写:

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

笔记:

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

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

  3. 不要all以无操作的身份打电话,您不再有ActiveRecord::Relation(酷),而是Array(不那么酷)。where({})很好。

  4. 起名很重要!如果你看到object你认为“单一元素”(这里不是真的),如果你看到objects你认为“收藏”。

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

    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 })
于 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 回答