2015-01-11 1 views
3

ActiveAdmin을 사용하여 큰 데이터베이스를 관리하고 내 모델 (ItemType) 중 하나에 ENUM 특성 (ItemType.units)이 있으며 다음 작업을 수행 할 수 있습니다. 과 같이 선택 상자, 라디오 버튼을 렌더링하는 Formtastic를 사용ActiveAdmin 및 Formtastic : ENUM을 사용하여 라디오 버튼 및 선택 상자 값 표시

class ItemType < ActiveRecord::Base 
    enum unit: [ :Packages, :Pieces, :KG ] 
end 
새 리소스를 만들 때이 제대로 작동

하지만 값 : ENUM 필드과 같이 모델에 정의되어

f.input :unit, :as => :radio, :collection => ItemType.units, include_blank: false 

양식을 사용하여 동일한 자원을 편집 할 때 검색되지 않습니다.


다음은 데이터베이스 레코드의 기본 "단일보기"입니다 :

The singular view

그리고 여기에 동일한 레코드에 대한 기본 "편집보기"입니다. 값 중 어느 것도 선택하지하는 방법을 주목하라 : 내가 대신 열거 형의 정수를 사용하는 것이

The edit view

답변

5

이 해시를 반환

ItemType.units #=> { "Packages" => 0, "Pieces" => 1, "KG" => 2 } 

라디오 입력을위한 콜렉션으로 사용하는 경우 입력 값을 0, 1, 2 등으로 설정합니다.이 값은 반환 값과 일치하지 않습니다 e는 ItemType#unit입니다 (예 : "KG"과 같은 열거 형의 문자열 표현을 반환합니다).

Rails는 목록의 값 중 하나가 속성 값과 일치 할 때만 선택된 값을 설정할 수 있습니다. 이 경우에는 절대 발생하지 않습니다.

이 이중성 (문자열 대 정수)은 다른 고통 지점으로 연결됩니다. enum의 값을 허용 된 값 (문자열 또는 정수 표현) 중 하나로 설정할 수 있기 때문에 실제로 양식을 저장할 수 없습니다. 양식 PARAMS가 ItemType#unit"1"를 할당하려고하는 문자열 ActiveAdmin을로 구문 분석하고 실패 때문에

it = ItemType.new 
it.unit = "KG" # this works 
it.unit = :KG # this works as well 
it.unit = 1 # this works but WTF?! 
it.unit = "1" # this will raise an ArgumentError 

.

솔루션은 실제로 매우 간단합니다. 매핑의 키만 사용하십시오.

f.input :unit, :as => :radio, :collection => ItemType.units.keys 

AR의 열거 형을 사용하지 않아도됩니다.

  • 그것이
  • 그것을 단단히 커플 응용 프로그램의 소스를 (이 응용 프로그램 코드없이 이해가되지 않습니다 단위 열의 데이터를 의미) 의미없는 숫자에 의미있는 문자열을 나타냅니다 몇 가지 이유 (db 콘솔과 같은 다른 응용 프로그램에서 데이터를 단독으로 사용하기가 어려움)
  • 열거 형 값의 순서는 유지되어야합니다 (또는 명시 적 매핑이 제공되어야 함). 어느 쪽도 개발자에게 친숙하지 않습니다.

미리 정의 된 문자열 배열을 사용하고 값이 미리 정의 된 값 목록에 있는지 확인하는 것이 더 나은 대안입니다. 줄을 따라 무엇인가 :

class ItemType 
    UNITS = %w[kg packages pieces] 
    validates :unit, inclusion: { in: UNITS } 
end 
0

: 당신이 열거를 선언 한 후 매핑을 액세스 할 때

class ItemType < ActiveRecord::Base 
    UNIT_VALUES = %w{Packages Pieces KG} 
end 

f.input :units, :as => :radio, :collection => ItemType::UNIT_VALUES, include_blank: false 
+0

이것은 똑같이 작동합니다. ActiveAdmin이 편집 양식에서 올바른 값을 표시하도록하는 방법을 찾고 있습니다. – aldavigdis