나는 무슨 일이 일어나고 있는지 깨닫기 전까지는 여러 해 동안 문제에 대해 머리를 터뜨 렸습니다.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로 보내지 만 꽤 지저분한 느낌입니다. 좀 더 맥락없이 제대로이 질문에 대답 할 수 있지만, 난 당신에 대해 생각하는 가능한 솔루션을 제공 할 수 있는지 잘 모르겠어요
감사합니다. Jeff - 나는 이것에 대해 생각하는 사람이 아님을 안심하게합니다. 나는 당신이 취한 접근 방식을 좋아하고 더 많은 네임 스페이스 접근 방식을 원한다면 CommitteeMember 클래스에 클래스 변수로 객체 매핑을 저장하여 CommitteeMember.instances [committee_member_id]에 의해 특정 멤버 인스턴스를 참조 할 수도 있습니다. 어느 쪽이든, 입력 주셔서 감사합니다. –