观察对象和关联对象

时间:2013-02-08 01:54:03

标签: ruby-on-rails ruby observer-pattern rails-activerecord

如何根据是否添加或删除关联对象来执行操作?

我系统中的每个用户都有外部服务的配置文件。该配置文件跟踪一些用户的字段。当我的系统上更新了一个或多个这些字段时,我会调用该服务来更新配置文件。这个电话费用很高,所以我只想在必要的时候付费。

每个用户都可以拥有一只宠物,表示为用户中的一个字段。用户的服务配置文件具有表示用户是否有宠物的标志。

class User < ActiveRecord::Base
  attr_accessible :name, :shoe_size
  attr_accessible :unimportant_field1, :unimportant_field2
  has_one :pet
end

class Pet < ActiveRecord::Base
  belongs_to :user
end

class UserObserver < ActiveRecord::Observer
  observe User

  def after_create(user)
    Service.post_user(user)
  end

  def after_update(user)
    if changed(user)
      Service.put_user(user)
    end
  end

  def changed(user)
    user.name_changed? || user.shoe_size_changed? || user.pet_changed?
    # But there is no pet_changed? method!
  end
end

用户可能会收到这样的宠物:

user.build_pet
   # or
user.pet = Pet.new
user.save!

或者像这样:

pet = Pet.create :user => user

问题:

  • 没有user.pet_changed?方法; ActiveRecord::Dirty无法跟踪关联。
  • 如果用户在上面的第二个代码片段中获得宠物,则用户的观察者不会被解雇。我可以单独观察宠物,只需更新用户个人资料的宠物字段。但是,如果我有宠物和用户的观察者,那么在第一个代码片段中,它将首先触发?如果宠物先开火,我会做POST还是PUT?

我正在寻找一个好的模式。也许我必须自己发明它。

1 个答案:

答案 0 :(得分:0)

不使用user.pet_changed?,而是使用user.pet.changed?