Rails의 열거 형에서 정수 값을 얻는 방법은 무엇입니까?


105

데이터베이스의 열에 해당하는 모델에 열거 형이 있습니다.

enum외모가 좋아 :

  enum sale_info: { plan_1: 1, plan_2: 2, plan_3: 3, plan_4: 4, plan_5: 5 }

정수 값을 어떻게 얻을 수 있습니까?

난 노력 했어

Model.sale_info.to_i

그러나 이것은 0 만 반환합니다.


그럴까요 Model.sale_info.value.to_i? 예Model.sale_info.plan_1.to_i
Florian Gl

아니요 ... 데이터베이스에 어떤 계획이 있는지 모르기 때문입니다. 나는 그것을 복구 할 및 그래서로 캐스팅integer
Cleyton

답변:


140

열거 형이있는 클래스에서 열거 형의 정수 값을 가져올 수 있습니다.

Model.sale_infos # Pluralized version of the enum attribute name

다음과 같은 해시를 반환합니다.

{ "plan_1" => 1, "plan_2" => 2 ... }

그런 다음 Model클래스 인스턴스의 sale_info 값을 사용하여 해당 인스턴스 의 정수 값 액세스 할 수 있습니다 .

my_model = Model.find(123)
Model.sale_infos[my_model.sale_info] # Returns the integer value

139

다음과 같이 정수를 얻을 수 있습니다.

my_model = Model.find(123)
my_model[:sale_info] # Returns the integer value

Rails 5 업데이트

rails 5의 경우 위의 메서드는 이제 문자열 값을 반환합니다.

지금 볼 수있는 가장 좋은 방법은 다음과 같습니다.

my_model.sale_info_before_type_cast

Shadwell의 답변은 레일 5에서도 계속 작동합니다.


1
'enum'이 모델에 대한 sale_info 메소드를 생성하기 때문입니다. [: sale_info]를 사용하여 sale_info 메소드에서 반환하는 대신 속성 값을 가져옵니다.
etlds

6
모델이 저장되지 않은 경우이 방법은 작동하지 않습니다. sale_info_before_type_cast 값 (및 my_model [: sale_info])은 my_model.sale_info에 후속 저장없이 문자열이 할당 된 경우 여전히 문자열입니다.
팀 스미스

42

레일 <5

또 다른 방법은 다음을 사용하는 것입니다 read_attribute().

model = Model.find(123)
model.read_attribute('sale_info')

레일> = 5

당신이 사용할 수있는 read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1

1
@GrantBirchmeier 답변을 업데이트했습니다. 사용할 수 있습니다 read_attribute_before_type_cast.
ArashM 2017

Rails 5 이전에는 model.read_attribute ( 'sale_info')가 model [: sale_info]와
같음

1

내 짧은 대답은 Model.sale_infos[:plan_2]당신이 가치를 얻고 싶다면plan_2


1

Rails 5.1 앱에서 동일한 작업을 수행하기 위해 Model에 메서드를 작성했습니다.

케이스를 준비하고, 이것을 모델에 추가하고 필요할 때 객체에서 호출하십시오.

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.