Я долго стучал головой о проблему, пока не понял, что происходит.
Я хочу создать комитет, в котором всегда должен быть хотя бы один член.Чтобы достичь этого, каждый участник проверяет, что это не последний член перед уничтожением.
Приведенный ниже код должен предотвращать уничтожение последнего члена, ЕСЛИ сам комитет не уничтожается, и в этом случае он самоуничтожается.
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, все они имеют разные идентификаторы объектов:
например#<Committee:0x00000105c41f20>
v. #<Committee:0x00000105c2c3a0>
Это означает, что даже когда я устанавливаю значение @destroy_initiated в значение true для одного экземпляра комитета с идентификатором 20, оно не будет установлено в значение true в экземпляре, на который ссылается один изее Committee_members.
Оставляя в стороне Rails 3.1, который, как я знаю, имеет карту идентичности, есть ли чистый обходной путь к наличию переменной экземпляра, которая доступна во всех экземплярах комитета?
Я рассматриваю вопрос о создании переменной класса, содержащей карту destroy_initiated?к каждому идентификатору комитета, но это выглядит довольно грязно.