関連オブジェクトが追加または削除されたかどうかに基づいてアクションを実行するにはどうすればよいですか?
私のシステムの各ユーザーは、外部サービスのプロファイルを持っています。プロファイルは、ユーザーのフィールドの一部を追跡します。システムでこれらのフィールドの 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 のどちらを行いますか?
従うべき良いパターンを探しています。多分私はそれを自分で発明しなければならないでしょう。