2011-03-12 8 views
5

그룹, 구성원 및 사용자 모델이 있습니다. has_many : through 연관과 연결되었습니다. 회원 가입은 그룹 내부에 중첩되어 있습니다.다른 모델의 메소드 콜백

내가 원하는 것은 누군가가 그룹에 가입하거나 떠날 때 (즉, 회원을 만들거나 파괴 할 때), 지배적 인 언어가 무엇인지 확인하기 위해 그룹에 대한 점검을 시작하는 것입니다 (이것은 사용자 모델의 속성입니다) 그룹 모델에서 언어 속성을 업데이트하십시오.

그룹 모델에서 define_language라는 메서드가 독립적으로 작동하는 것처럼 보입니다.

지금 내가 콜백 after_save 와 함께이 일을 생각하고 있었다, 그러나 나는 (다른) 그룹 모델의 방법을 참조 문제 가 있어요, 회원 모델에서이 메소드를 호출 할 필요가있다.

나는이 방법을 멤버쉽 모델이 아니라 그룹 모델에 넣었습니다. 의미 상으로는 멤버쉽과 관련이 거의 없습니다. 이 가정이 잘못 되었습니까? 효율적인 방법으로이 문제를 어떻게 해결할 수 있습니까?

답변

2

한 가지 방법은 다음과 같습니다

class Membership < ActiveRecord::Base 
    belongs_to :group 
    before_save :update_group_language 

    ... 

    private 

    def update_group_language 
    self.group.define_language 
    end 
end 

나는이 비록 일할 수있는 방법을 볼 수 없습니다

class Membership < ActiveRecord::Base 
    belongs_to :group 
    before_save group.define_language 
end 

그 문제는 레일이 처음로드 될 때 belongs_to가 루비에 의해서만 평가된다는 것입니다.

+0

이 답변은 나를 위해 일했습니다! 감사 – SupremeA

1

내가 방금 Membership.rb

before_save group.define_language 

그리고 tadaa에서 실행, 그것을 알아 냈어! Group.rb 모델에서 define_language를 호출합니다. 옵션

당신이 관계를 정의하는 등의 추가 할 수 있습니다

before_save group.define_language "id = #{group_id}" 
+0

이것은 올바르지 않습니다. "정의되지 않은 로컬 변수 또는 메소드 그룹"오류가 발생하고 콜백에서 self.group을 호출 할 수 없으므로 메소드에서 호출을 랩핑해야합니다. @ cmrichards – rmcsharry

관련 문제