2011-07-04 5 views
2

내 앱에는 프로젝트가있는 단계 (예 : select 목록에서 사용자가 선택한 옵션)를 관리하는 수많은 옵션 목록이 있습니다. 나는 이것들을 많이 가지고 있으며 조직 문제에 직면하고있다. 즉 시스템을 DRY 상태로 유지할 수있는 곳을 한 곳에서 정의해야한다.중요한 목록을 보관할 곳

또한 정규화를 위해 많은 양의 다형성 테이블을 생성하는 것에주의를 기울입니다. 정규화를 위해 실제 값으로 너무 많이 추가하지 않고도 코드를 복잡하게 만드는 경우가 있습니다.

1) 필드에만 사용할 수있는 옵션과 2) 시스템 전체에서 사용할 수있는 옵션을 저장할 위치의 예를 들려 줄 수 있습니까?

답변

2

그런 종류의 시나리오에서는 symbolize 보석을 사용합니다. 필드 옵션을 문자열로 저장하고, 모델 값에 대한 연산을 기호로 수행하고, 라벨에 i18n을 사용하고, 옵션을 기반으로 select을 빌드하는 헬퍼 세트도 있습니다.

또한 모델 자체에서 사용 가능한 옵션을 설정 했으므로 코드는 매우 깨끗하게 유지됩니다.

하면 체크 아웃 :

class User < ActiveRecord::Base 
    symbolize :gender, :in => [:female, :male], :scopes => true 
    symbolize :so, :in => { 
    :linux => "Linux", 
    :mac  => "Mac OS X" 
    }, :scopes => true 

    # Allow blank 
    symbolize :gui, :in => [:gnome, :kde, :xfce], :allow_blank => true 

    # Don`t i18n 
    symbolize :browser, :in => [:firefox, :opera], :i18n => false, :methods => true 

    # Scopes 
    symbolize :angry, :in => [true, false], :scopes => true 

    # Don`t validate 
    symbolize :lang, :in => [:ruby, :c, :erlang], :validate => false 

    # Default 
    symbolize :kind, :in => [:admin, :manager, :user], :default => :admin 
end 
:

여기 https://github.com/nofxx/symbolize

가 문서의 샘플입니다

0

응용 프로그램 컨트롤러에 상수 배열을 저장하면 문제가 해결됩니까? 액티브가 ENUM 또는 SET 속성을 지원하지 않기 때문에, 즉 완벽하게 맞지는 데이터베이스 측, 필요한 위트 것

class ApplicationController < ActionController::Base 
    OPTIONS = ["option1", "option2", "etc"] 
end 
1

, 나는 최선의 방법은 (이니셜 라이저에 넣어, 일정이 데이터를 저장하는 것입니다 생각 예 : conf/initializers/constants.rb). 이 방법으로 두 모델을 사용하여 <select> 태그를 만들고 모델 (예 : validates :field, :inclusion => ALLOWED_VALUES)을 만들 수 있습니다. 응용 프로그램 컨트롤러에 상수를 저장 한 경우 모델에서 상수에 액세스 할 수 없습니다.

관련 문제