2013-03-07 154 views
0

我有下面的类方法,并想知道是否有更漂亮(更ruby-ist)的方法来解决这个问题。'case'里面的where子句

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

谢谢!

回答

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 
2

它被认为是不好的味道(代码味道)重新定义这样的变量(将其从字符串转换为整数)。

这是你的代码更清洁的版本:

def self.of_users_that(type) 
    map = {'registered' => 1, 
     'apologized' => 2} 
    Subscription.where(:regoption_id => map[type]) 
end 
+0

重用变量使用不同的值是一个可怕的做法,这是可悲的,因为这是非常普遍的(并且很容易修复......)。 – tokland 2013-03-07 11:30:50