首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >观测对象及相关对象

观测对象及相关对象
EN

Stack Overflow用户
提问于 2013-02-08 01:54:03
回答 1查看 148关注 0票数 0

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

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

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

代码语言:javascript
运行
复制
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

用户可能会获得这样的宠物:

代码语言:javascript
运行
复制
user.build_pet
   # or
user.pet = Pet.new
user.save!

或者像这样:

代码语言:javascript
运行
复制
pet = Pet.create :user => user

问题:

  • 没有user.pet_changed?方法;ActiveRecord::Dirty不跟踪关联。
  • 如果用户得到了上面第二个代码片段中的宠物,则不会触发用户的观察者。我可以单独观察宠物,只需更新用户配置文件的宠物字段。但是,如果我在宠物和用户上都有观察者,那么在第一个代码片段中,哪个会首先触发呢?如果宠物先着火,我是做帖子还是放?

我在找一个很好的模式。也许我得自己发明。

EN

回答 1

Stack Overflow用户

发布于 2013-02-08 04:56:22

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14764489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档