2011-11-10 4 views
0

보석이나 모델 별 설정 방법이 있는지 궁금합니다. 예를 들어, 사용자 환경 설정.ActiveRecord 인스턴스 설정

모델별로 기본 설정을 갖고 싶지만 (클래스 속성을 말합니다.) 다른 테이블에서 정의 할 수 있습니다 (모델에 직렬화 가능 필드가 필요 없음). 예를 들어

:

user = User.find(1) 
user.settings.newsletter # => true 

키 => 문자열 값 => 문자열을 입력 => 문자열 (부울, 날짜, 문자열 등의 스키마를 가지고 UserSetting의 모델이 될 것이다 .. .)

UPDATE :

것은 여기에서 끝이 내 솔루션입니다. 나는 사용자 has_many의 UserSettings로 이것을 구현하는 것이 설정에 대한 값 유형 (부울, 시간 등)

def setting(key, whiny=true) 
     s = user_settings.where(:key => key).first 

     if s 
     case s.value_type 
     when 'Boolean' 
      s.value.to_i == 1 
     when 'Time' 
      Time.parse(s.value) 
     else 
      s.value 
     end 
     else 
     if whiny 
      raise NameError, "Setting key #{key} does not exist for #{name}." 
     else 
      nil 
     end 
     end 
    end 

답변

1

을 지원하고, UserSetting는 USER_ID, 키와 값입니다. 당신이

user = User.find(1) 
user.setting('newsletter') # => true/false (or nil if that setting doesn't exist) 
+0

멋지 네요 .try (: value)가되어야합니다. –

+0

@RobertRoss 아, 그래. 그것을 수정했습니다. 감사. – MrTheWalrus

+0

최종 결과에 관심이 있으시면 원본 게시물을 업데이트하십시오. –

0

has_settings 보석이 작업을 수행 할 것으로 보인다 갈 수있는, 그런

class User < ActiveRecord::Base 
    has_many :user_settings 
    def setting(key) 
    user_settings.where(:key => key).first.try(&:value) 
    end 
end 

class UserSetting < ActiveRecord::Base 
    belongs_to :user 
end 

을하지만, 아아 유지 한 것으로 나타났습니다하지 않습니다 은 어쩌면과 같이, 그들에 액세스하기위한 편리한 방법이있다. This fork은 최소한 Rails 3를 지원합니다.

사용자의 요구에 맞는 보석을 찾을 수없는 경우 간단한 has_many 관계와 약간의 연결 확장 마법을 사용하여 직접 구현하는 것이 매우 간단합니다. (테스트 안 함) :

분명히이 작업은 완료되지만 분명히 매우 강력하지 않으므로 문제가 발생할 수 있습니다.

관련 문제