簡體   English   中英

觀察對象及相關對象

[英]Observing object and associated object

如何根據已添加或刪除關聯對象執行操作?

我系統中的每個用戶在外部服務上都有一個配置文件。 該配置文件跟蹤用戶的某些字段。 當我的系統上更新了這些字段中的一個或多個時,我會致電服務以更新配置文件。 通話費用昂貴,因此我只想在必要時撥打。

每個用戶可以擁有一只寵物,在用戶中表示為字段。 用戶的服務配置文件具有表示用戶是否有寵物的標志。

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不跟蹤關聯。
  • 如果用戶像上面第二個代碼片段中那樣得到寵物,則不會解雇用戶的觀察者。 我可以分別觀察寵物,並僅更新用戶個人資料的寵物字段。 但是,如果我在pet和user上都有觀察者,那么在第一個代碼片段中,哪個將首先觸發? 如果寵物先開火,我應該做POST還是PUT?

我正在尋找一個好的模式。 也許我必須自己發明它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM