1

私はRailsが初めてなので、簡単な解決策があるかもしれません。しかし、この正確な問題をどこかで見つけることさえできませんでした。他の投稿では、destroy と delete (両方とも同じ結果を試しました) を扱うか、関連付けられたオブジェクトの動作について言及していません。

私の問題: :through を介して多対多の関連付けを作成したい。関連 (つまり、関連オブジェクトではなく関係オブジェクト) を削除すると、関連オブジェクトのすべてのモデル インスタンスでこの関連が削除 (更新) されることが期待されます。しかし、これは完全には起こりません。

私の例:

Meeting < ActiveRecord::Base
  has_many :participations
  has_many :users, :through => :participations

User < ActiveRecord::Base
  has_many :participations
  has_many :meetings, :through => :participations

Participation < ActiveRecord::Base
  belongs_to :meeting, :foreign_key => :meeting_id
  belongs_to :user, :foreign_key => :user_id

新しい関連付けを作成すると、それに応じて関連付けられたオブジェクトが更新されます。

u = User.find(...)
m = Meeting.find(...)
m.users<< u

この方法で関連付けを作成する場合も同じです。

m.participations.create(:user_id => u.id)  # this requires to make the user_id attribute accessible

関連付けられたユーザー モデル インスタンスを見ると、期待どおりに更新されています。

u.meetings >> contains the newly created association to the meeting m

この関連付けを破棄 (削除ではなく!) すると、関連付けられたオブジェクトが期待どおりに更新されません。

m.users.find_by_user_id(u.id).destroy
m.users >> []
u.meetings >> still contains the destroyed association to meeting m

u.meetings が更新され、空 ([]) であると予想していました。検証を追加しても、これを解決するのに役立ちませんでした:

Meeting < ActiveRecord::Base
  validates_associated :contacts
or
Participation < ActiveRecord::Base
  validates_presence_of :contact, :interview

私は何を間違っていますか、またはここで何が欠けていますか?

Rails 3.2.8 を使用しています

私を助けてくれるすべての人に感謝します。

4

3 に答える 3

2

あなたはやるべきです:dependent => :destroy

Meeting < ActiveRecord::Base
  has_many :participations, :dependent => :destroy
  has_many :users, :through => :participations

User < ActiveRecord::Base
  has_many :participations, :dependent => :destroy
  has_many :meetings, :through => :participations

Participation < ActiveRecord::Base
  belongs_to :meeting, :foreign_key => :meeting_id
  belongs_to :user, :foreign_key => :user_id

participationこれにより、関連付けられたユーザーまたは会議のいずれかが破棄された場合に必ず破棄されます。

于 2012-10-14T12:30:09.393 に答える
1

model次の関係オプションでを更新する必要があります。

dependent: destroy

destroy関連するオブジェクトを呼び出します。

参考:http ://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Deleting+from+associations

于 2012-10-14T12:27:15.380 に答える
0

このような問題が考えられます。あなたの例では、

m.users.find_by_user_id(u.id).destroy
m.users >> []
u.meetings >> still contains the destroyed association to meeting m

uで、u.meetingsの前にすでにロードされていm.users.find_by_user_id(u.id).destroyました。次にu.meetings、キャッシュされたデータを出力します。

u.meetings(true)違いがあるかどうかを試してみることができu.reload; u.meetingsます。

于 2012-10-14T12:44:21.257 に答える