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: