0

Rails/Ruby です。次のコードで繰り返しを削除するための DRYer バージョンがあるかどうか疑問に思っています。

case params[:order]
when 'rating_ascend'
  order = {:order => 'rating_average ASC'}
when 'rating_descend'
  order = {:order => 'rating_average DESC'}
when 'distance'
  order = {:order => 'distance ASC'}
else
  order = {:order => 'distance ASC'}
end

ありがとう。

4

6 に答える 6

5

またはもちろん、あります。

order = case params[:order]
  when 'rating_ascend'
    {:order => 'rating_average ASC'}
  when 'rating_descend'
    {:order => 'rating_average DESC'}
  else
    {:order => 'distance ASC'}
end

またはこれ(私はこのように書きませんが、これはDRYerです)

order = {:order => case params[:order]
  when 'rating_ascend' then 'rating_average ASC'
  when 'rating_descend' then 'rating_average DESC'
  else 'distance ASC'
end}

ここまでコードを単純化すると、「距離 ASC」の結果が 2 倍になっていることがわかります。それはタイプミスですか、それとも意図的なものですか?

于 2012-08-10T12:57:05.043 に答える
3
order = {}
order[:order] = case params[:order]
when "rating_ascend" then "rating_average ASC"
when "rating_descend" then "rating_average DESC"
else "distance ASC"
end
于 2012-08-10T12:57:49.363 に答える
3
orders = {'rating_ascend' =>  'rating_average ASC', 'rating_descend' => 'rating_average DESC', 'distance' => 'distance ASC'}
Model.order(orders[params[:order]] || 'distance ASC')
于 2012-08-10T13:23:39.603 に答える
2

「抽出メソッド」リファクタリング パターンの使用:

def determine_order(order)
  case order
  when 'rating_ascend'
    'rating_average ASC'
  when 'rating_descend'
    'rating_average DESC'
  else
    'distance ASC'
end

order = {:order => determine_order(params[:order])}
于 2012-08-10T13:39:01.967 に答える
1

不要なケースを削除するだけで、前の回答と同じようにすることもできます

  when 'distance'
    'distance ASC'

else 部分も同じように実行されるためです。

order = {:order => case params[:order]
  when 'rating_ascend'
    'rating_average ASC'
  when 'rating_descend'
    'rating_average DESC'
  else
    'distance ASC'
end}
于 2012-08-10T13:02:27.253 に答える
0

さまざまなオプションでハッシュを作成し、フェッチを使用してオプションを見つけるのはどうですか?

order = order_hash.fetch(params[:order], {:order => 'distance ASC'})

def order_hash
  {
    'rating_ascend' => {:order => 'rating_average ASC'},
    'rating_descend' => {:order => 'rating_average DESC'},
    'distance' => {:order => 'distance ASC'}
  }
end

また、fetch はデフォルト オプションを 2 番目のパラメータとして使用できるため、ケースの最後で else 問題を簡単に解決できます。

于 2014-11-07T22:45:07.920 に答える