0

私は次のクラスメソッドを持っていますが、これを行うためのよりきれいな(よりルビー主義の)方法があるかどうか疑問に思いました。

def self.of_users_that(type)
  case type 
  when "registered"
    type = 1
  when "apologized"
    type = 2
  end
  Subscription.where(:regoption_id => type)
end

ありがとう!

4

2 に答える 2

2

そのような変数を再定義する(文字列から整数に変換する)ことは、悪趣味(コードの臭い)と見なされます。

コードのよりクリーンなバージョンは次のとおりです。

def self.of_users_that(type)
  map = {'registered' => 1, 
         'apologized' => 2}
  Subscription.where(:regoption_id => map[type])
end
于 2013-03-07T11:25:42.327 に答える
1

私は通常、これらの種類の定数のモデル内で定数を宣言します。セルヒオと同じ答えですが、定数を使用しています

class Subscription < ActiveRecord::Base
  USER_TYPES = { 'registered' => 1, 'apologized' => 2 }

  def self.of_users_that(type)
    where(regoption_id: USER_TYPES[type])
  end
end

または単にスコープを使用します

scope :registered, where(regoption_id: 1)
scope :apologized, where(regoption_id: 2)

または組み合わせ

class Subscription < ActiveRecord::Base
  USER_TYPES = { 'registered' => 1, 'apologized' => 2 }

  scope :registered, where(regoption_id: USER_TYPES['registered'])
  scope :apologized, where(regoption_id: USER_TYPES['apologized'])
end
于 2013-03-07T11:32:36.823 に答える