リレーションシップコレクションから削除中に更新されるオブジェクトのコールバックは、私のために実行されていないようです。新しいコレクションに置換された関連付けのActiveRecordコールバック
エンティティ(ユーザー/場所/物)と場所(郵便番号、住所、近所)の間の多相関係として機能するモデルEntityLocationがあります。
class EntityLocation < ActiveRecord::Base
belongs_to :entity, :polymorphic => true
belongs_to :location, :polymorphic => true
def after_save
if entity_id.nil? || location_id.nil?
# Delete me since I'm no longer associated to an entity or a location
destroy
end
end
end
は、この例では、私はmy_thing.locationsが参照する「場所」のコレクションで「シング」を持っていることを前提としています。これは
は、私は、コード
my_thing.locations = [my_thing.locations.create(:location => Zip.find(3455))]
を書く場合は、期待通りに新しいEntityLocationが作成され、正確my_thing.locationsから参照することができますジップのコレクションを返し、住所、など。しかし、問題は、以前はこのコレクションに含まれていたレコードが、nilのentity_id属性を持つデータベースに孤立していることです。私はafter_saveコールバックでこれらのオブジェクトを削除しようとしていますが、古いオブジェクトに対して決して実行されません。
また、after_updateとafter_removeを使用してみましたが、どちらも古いレコードで呼び出されませんでした。新しく作成されたレコードafter_saveコールバックは期待通りに呼び出されますが、それは私を助けません。
Railsは、アクティブレコードを介してコールバックチェーンを実行せずに、以前に参照されたオブジェクトを更新しますか?すべてのアイデアを高く評価ありがとうございました。
ありがとうございました。多態性の理由は、クラスEntityもクラスLocationもないからです。 Entityは、User、Place、またはThingのインスタンスです。場所は、Zip、Address、またはNeighborhoodのインスタンスです。したがって、EntityLocationモデルは、entity_type、entity_id、location_type、およびlocation_idフィールドを持つという点で多態性です。 それにもかかわらず、私はそれが多型であるにもかかわらず、あなたが記述した振る舞いを達成したいと思います。多分、私はちょうど正しいRails構文を見逃しているでしょうか? – thedob
Rails自体のハッキングがなければ、私が知る限り、不可能な "両面多形性"が必要なようです。 has_many_polymorphs gem(https://github.com/fauna/has_many_polymorphs)を見てください。 Rails3用に更新されているかどうかはわかりませんが、役立つかもしれません。 – zetetic