如何在rails中的相关模型中管理启用/不可用状态

时间:2014-01-14 00:33:29

标签: ruby-on-rails activerecord

比如说我有一个位置和一个事件,它们的操作如下:

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的方法,它将管理所有这些关系的启用和取消启用。关于如何管理这个还有其他想法吗?

1 个答案:

答案 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个对象。