2013-03-07 3 views
0

나는 다음과 같은 클래스 메소드를 가지고 있으며, 이것에 대해 더 가느 다란 (루비 같은) 방법이 있는지 궁금해하고있다.where case 내 'case'

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