0

我有以下类方法,并且想知道是否有更漂亮(更多 ruby​​-ist)的方式来解决这个问题。

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

我通常在模型中为这些类型的常量声明一个常量。与 Sergio 的答案相同,但使用常数

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 回答