Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 观察对象和关联对象_Ruby On Rails_Ruby_Observer Pattern_Rails Activerecord - Fatal编程技术网

Ruby on rails 观察对象和关联对象

Ruby on rails 观察对象和关联对象,ruby-on-rails,ruby,observer-pattern,rails-activerecord,Ruby On Rails,Ruby,Observer Pattern,Rails Activerecord,如何根据是否已添加或删除关联对象来执行操作 我的系统中的每个用户都有一个外部服务的配置文件。配置文件跟踪用户的某些字段。当一个或多个字段在我的系统上更新时,我调用服务来更新配置文件。这个电话很贵,所以我只想在必要的时候打 每个用户都可以有一个宠物,表示为用户中的一个字段。用户的服务配置文件有一个标志,表示用户是否有宠物 class User < ActiveRecord::Base attr_accessible :name, :shoe_size attr_accessible

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

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

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

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
问题:

  • 没有
    用户。宠物已更改?
    方法
    ActiveRecord::Dirty
    不跟踪关联
  • 如果用户在上面的第二个代码片段中得到了类似的宠物,那么用户的观察者不会被激发。我可以单独观察宠物,只需更新用户档案中的宠物字段。但如果我在pet和用户上都有观察者,那么在第一个代码片段中,哪个将首先触发?如果宠物先开火,我是做POST还是PUT

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

不要使用
user.pet\u changed?
,而是使用
user.pet.changed?

试试这个:。。。有什么好处吗?@micapam,那是另一种情况。正确的答案是在宠物身上使用
changed?
方法。使用
user.pet.changed?
而不是
user.pet.changed?
。我试图捕获的是宠物出现或消失的时间。对象本身的变化可能是另一个问题,但我主要需要知道user.pet何时从零变为非零&反之亦然。想法?是的。你可以做的一件事就是观察宠物模型。如果您只关心用户修改宠物的情况,那么您可以使用
new\u record?
方法检查宠物是否是新的。所以你可以做
user.pet.new\u记录?
。类似地,您可以使用
销毁?
检查对象是否已销毁。我从未使用过Distromed,因此您的里程可能会有所不同。查看ActiveRecord::Persistence的API: