0

関連オブジェクトが追加または削除されたかどうかに基づいてアクションを実行するにはどうすればよいですか?

私のシステムの各ユーザーは、外部サービスのプロファイルを持っています。プロファイルは、ユーザーのフィールドの一部を追跡します。システムでこれらのフィールドの 1 つ以上が更新されると、サービスを呼び出してプロファイルを更新します。通話料が高いので、必要な時だけかけたい。

各ユーザーは、ユーザーのフィールドとして表されるペットを持つことができます。ユーザーのサービス プロファイルには、ユーザーがペットを飼っているかどうかを表すフラグがあります。

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関連付けを追跡しません。
  • 上記の 2 番目のコード フラグメントのようにユーザーがペットを取得した場合、ユーザーのオブザーバーは起動されません。ペットを個別に観察し、ユーザー プロファイルのペット フィールドを更新するだけです。しかし、ペットとユーザーの両方にオブ​​ザーバーがある場合、最初のコード フラグメントでは、どちらが最初に起動するでしょうか? ペットが最初に発火した場合、POST と PUT のどちらを行いますか?

従うべき良いパターンを探しています。多分私はそれを自分で発明しなければならないでしょう。

4

1 に答える 1

0

を使用する代わりに、 をuser.pet_changed?使用してuser.pet.changed?ください。

于 2013-02-08T04:56:22.797 に答える