比如说我有一个位置和一个事件,它们的操作如下:
class Location < ActiveRecord::Base
has_many :events
default_scope { where is_enabled: true }
end
class Event < ActiveRecord::Base
belongs_to :location
default_scope { where is_enabled: true }
end
我遇到的问题是我可以启用已启用的事件但该位置无法启用。在这种情况下,我是否需要更新所有其他列以反映这一点(即将具有该特定位置的location_id的所有事件&#39; is_enabled设置为false)。我想创建一个名为LocationManager的类,它将有一个名为unenable的方法,它将管理所有这些关系的启用和取消启用。关于如何管理这个还有其他想法吗?
答案 0 :(得分:1)
我会在Location
上进行回调,如果is_enabled
字段更改为Event
,则会更新所有关联的is_enabled
对象的false
字段给定的Location
实例:
class Location < ActiveRecord::Base
has_many :events
default_scope { where is_enabled: true }
after_update :disable_corresponding_locations, :if => lambda { self.is_enabled_changed? && self.is_enabled == false }
private
def disable_corresponding_locations
self.events.map {|event| event.update_attributes :is_enabled => false }
end
end
class Event < ActiveRecord::Base
belongs_to :location
default_scope { where is_enabled: true }
end
这样,您可以在after_update
上创建另一个回调,如果需要,可以重新启用与Event
相关联的所有Location
个对象。