2010-11-22 13 views
0

リレーションシップコレクションから削除中に更新されるオブジェクトのコールバックは、私のために実行されていないようです。新しいコレクションに置換された関連付けの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は、アクティブレコードを介してコールバックチェーンを実行せずに、以前に参照されたオブジェクトを更新しますか?すべてのアイデアを高く評価ありがとうございました。

答えて

0

なぜこれはポリモーフィックである必要がありますか?多対多の関係をモデル化するには、単純にhas_many :throughを使用すると思われます。

第2に、:dependent => :destroyとの関連付けによって結合テーブルの行を単に削除しないでください。そして、あなたはどちらの側が同様に結合テーブルの行を削除するから今すぐ削除カスタムコールバック

class Entity < ActiveRecord::Base 
    has_many :entity_locations, :dependent => :destroy 
    has_many :locations, :through => :entity_locations 
end 

class EntityLocation < ActiveRecord::Base 
    belongs_to :entity 
    belongs_to :location 
end 

class Location < ActiveRecord::Base 
    has_many :entity_locations, :dependent => :destroy 
    has_many :entities, :through => :entity_locations 
end 

を必要としません。

+0

ありがとうございました。多態性の理由は、クラスEntityもクラスLocationもないからです。 Entityは、User、Place、またはThingのインスタンスです。場所は、Zip、Address、またはNeighborhoodのインスタンスです。したがって、EntityLocationモデルは、entity_type、entity_id、location_type、およびlocation_idフィールドを持つという点で多態性です。 それにもかかわらず、私はそれが多型であるにもかかわらず、あなたが記述した振る舞いを達成したいと思います。多分、私はちょうど正しいRails構文を見逃しているでしょうか? – thedob

+0

Rails自体のハッキングがなければ、私が知る限り、不可能な "両面多形性"が必要なようです。 has_many_polymorphs gem(https://github.com/fauna/has_many_polymorphs)を見てください。 Rails3用に更新されているかどうかはわかりませんが、役立つかもしれません。 – zetetic

関連する問題