2011-09-05 3 views
12

몽고이드에서 모델에 대한 세터 또는 게터를 오버라이드 할 수있는 방법이 있습니까? 다음과 같이하십시오 :몽고 이드 모델의 세터와 게터를 오버라이드

여기서 가상 필드를 사용하지 않고 name 메서드를 덮어 쓸 수 있습니까?

+0

관련 : http://stackoverflow.com/questions/6699503/mongoid-custom-setters-getters-and-super – marcgg

답변

16
def name=(projectname) 
    self[:name] = projectname.capitalize 
end 
+1

@ user923636 한 번 생성 된 문서의 "_id"필드를 변경할 수 없습니다. 따라서 프로젝트 이름이 변경되면 이전 문서를 삭제하고 이름이 변경된 새 문서를 만들어야합니다. – rubish

23

를보다 효율적으로 사용

def name=(projectname) 
    super(projectname.capitalize) 
end 

방법

self[:name] = projectname.capitalize 

내가 오버라이드 (override) 할 필요가있는 유사한 문제가 있었다 끝없는 재귀에게

+1

감사합니다. self [: name]에서 재귀를 얻었습니다. super works – GTDev

+0

@GearHead 또한 여전히 내 코드의 일부가 self [: name] 표기법을 사용하지만 지금까지 어떠한 재귀도 발생하지 않았지만 timme (super) (super)로 전환했습니다. – rubish

+2

슈퍼 클래스가 없으면 어떻게 '슈퍼'가 작동할까요? '몽고 이드 :: 문서'가 모듈로 포함되어 있는데, 여기에 혼란 스럽습니다 ... – tothemario

1

발생할 수 있습니다 그것으로 과부하 원인, 위험 할 수있다 belongs_to : 사용자 관계에 대한 "사용자"설정 자. 이 솔루션은이 경우뿐만 아니라 동일한 클래스 내에서 이미 정의 된 메서드를 래핑하기위한 것입니다.

class Class 
    def wrap_method(name, &block) 
    existing = self.instance_method(name) 

    define_method name do |*args| 
     instance_exec(*args, existing ? existing.bind(self) : nil, &block) 
    end 
end 

이 당신이 당신의 모델 클래스에서 다음을 수행 할 수 있습니다

wrap_method :user= do |value, wrapped| 
    wrapped.call(value) 
    #additional logic here 
end 
+0

정확히 내가 뭘 찾고 있었는지, 멋진 해결책. +1 – user2398029

+0

자전거를 재발 명하려고 시도하지 마십시오. 이에 대해 alias_method_chain을 사용하십시오. – sandrew

+0

감사합니다! 관계 설정자와 게터와도 문제가 있습니다. sandrew의 코멘트는 a_m_c 's를 들여다 보았고 Ruby 2.0의 Module # prepend에 대해 배웠다. 멋진 솔루션과 정말로 깨끗한 - http://dev.af83.com/2012/10/19/ruby-2-0-module-prepend.html –

관련 문제