2011-08-04 2 views
1

나는 무슨 일이 일어나고 있는지 깨닫기 전까지는 여러 해 동안 문제에 대해 머리를 터뜨 렸습니다.ID 맵없이 ActiveRecord 객체에 영구 인스턴스 변수를 설정하는 방법은 무엇입니까?

저는 항상 최소한 한 명 이상의 위원이 있어야하는위원회를 갖고 싶습니다. 이를 위해 각 구성원은 소멸되기 전에 마지막 구성원이 아닌지 확인합니다.

다음 코드는위원회 자체가 파괴되는 경우를 제외하고 마지막 구성원이 파괴되는 것을 방지해야합니다.이 경우위원회는 행복하게 스스로 파괴합니다.

class Committee < ActiveRecord::Base 

    has_many :committee_members 
    before_destroy: { @destroy_initiated = true } 

    def destroy_initiated? 
    @destroy_initiated 
    end 

end 

class CommitteeMember < ActiveRecord::Base 

    belongs_to :committee 
    before_destroy :ensure_not_last 

    def ensure_not_last 
    unless self.committee.destroy_initiated? 
     if self.committee.committee_members.count == 1 
     raise 'You cannot remove the last committe member. Try destroying the committee instead' 
     end 
    end 
    end 

end 

문제는 각 CommitteeMember이위원회 객체의 다른 인스턴스를 참조하는 것입니다 문제, 그들은 모두 서로 다른 개체의 정체성이 :

예를 #<Committee:0x00000105c41f20> V는. #<Committee:0x00000105c2c3a0>

이것은 내가 ID (20)와위원회의 예를 한 번에 사실로 @destroy_initiated 세트에도, 그것의 committee_members 중 하나가 참조하는 인스턴스에서 true로 설정하지 않을 것을 의미.

내가 아는 레일즈 3.1에는 아이덴티티 맵이 있지만,위원회의 모든 인스턴스에서 사용할 수있는 인스턴스 변수를 갖는 것에 대한 깨끗한 해결 방법이 있습니까?

destroy_initiated의지도가 포함 된 클래스 변수를 작성하는 것이 좋습니다. 각위원회 ID로 보내지 만 꽤 지저분한 느낌입니다. 좀 더 맥락없이 제대로이 질문에 대답 할 수 있지만, 난 당신에 대해 생각하는 가능한 솔루션을 제공 할 수 있는지 잘 모르겠어요

답변

0

... 난 그냥 최근에 생산에 넣어 응용 프로그램에서

, 우리는 것 기본적으로 ApplicationController에 객체를 인스턴스 변수로 캐시합니다. 그런 다음 필요할 때마다 Active Record로 인스턴스 변수를 찾는 대신 인스턴스 변수를 요청하기 만하면됩니다.

class ApplicationController < ActionController::Base 
    before_filter :set_committee 

    def set_committee 
    @committee ||= Committee.new() 
    end 
end 

은 그래서 지금, 요청의 기간 동안,와 ApplicationController로부터 상속 무엇이든은 @committee 개체에 액세스 할 수 있습니다. 유사한 패턴 (응용 프로그램 컨트롤러 일 필요는 없으며 다른 컨트롤러 일 수도 있음)을 사용할 수있는 경우 본질적으로 요청 기간 동안 "전역"변수를 갖게됩니다.

+0

감사합니다. Jeff - 나는 이것에 대해 생각하는 사람이 아님을 안심하게합니다. 나는 당신이 취한 접근 방식을 좋아하고 더 많은 네임 스페이스 접근 방식을 원한다면 CommitteeMember 클래스에 클래스 변수로 객체 매핑을 저장하여 CommitteeMember.instances [committee_member_id]에 의해 특정 멤버 인스턴스를 참조 할 수도 있습니다. 어느 쪽이든, 입력 주셔서 감사합니다. –

관련 문제