web-dev-qa-db-ja.com

仕組み-`belongs_to:user、dependent :: destroy`

私は働く方法を知っていますhas_many :posts, dependent: :destroyUserまたはhas_many投稿が破棄され、所属するすべての投稿も破棄されます。

しかし、Postモデルbelongs_to :user, dependent: :destroy? Rails Guideでオプションを見つけましたが、それを操作する方法を見つけることができませんでした。

http://guides.rubyonrails.org/association_basics.html

10
ironsand
"has_many" 

教師は「has_many」の生徒です。すべての生徒には1人の教師しかいませんが、すべての教師には多くの生徒がいます。これは、所属する教師を参照する外部キーまたはteacher_idが生徒にあることを意味します。

"belongs_to" 

生徒は教師に「所属」します。すべての教師には多くの生徒がいますが、すべての生徒には1人の教師しかいません。繰り返しますが、生徒には、所属する教師を参照する外部キーがあります。

この生徒/教師の概念を使用してこれを解決しましょう。

教師モデル

class Teacher < ActiveRecord::Base
  has_many :students, dependent: :destroy
end

学生モデル

class Student < ActiveRecord::Base
    belongs_to :teacher 
end 

これらのモデルを仮定すると

Teacher.destroy 

インスタンス化された教師と、その教師に関連付けられていたすべての生徒が削除されます。

例えば

Teacher.find(345).destroy 

ID 345の教師の記録を破棄し、その教師に関連付けられているすべての生徒を破棄します。

さて、質問の核心に、私のモデルがこのように見えるとどうなりますか?

教師モデル

class Teacher < ActiveRecord::Base
  has_many :students, dependent: :destroy
end

学生モデル

class Student < ActiveRecord::Base
    belongs_to :teacher, dependent: :destroy
end 

電話した場合

Student.destroy

これにより、インスタンス化された生徒とその生徒の関連する教師が破壊されます。しかし、私の知る限り(そしてドキュメントによると)、これはその教師に関連する他の生徒を破壊せず、彼らを「孤立」させます。

これはRubyこれに関するドキュメント1 からの引用です

:destroyに設定すると、関連するオブジェクトは、このオブジェクトが破棄されるときに破棄されます。孤立したレコードが残る可能性があるため、belongs_toを別のクラスのhas_many関係と組み合わせて使用​​する場合は、このオプションを指定しないでください。

27
JohnSalzarulo

すべてのユーザーのインスタンスをインスタンス化してから、メッセージdestroyを各ユーザーに送信します。この方法で破壊されたユーザーの通常の破壊ライフサイクルになります。

1
Austio

私は依存を設定しようとしました:: destroyをbelongs_toに。例

class Post < ActiveRecord::Base
  has_many :comments, dependent: :destroy
end

class Comment < ActiveRecord::Base
  belongs_to :post, dependent: :destroy
end

コンソールでは、コメントが破棄された場合、投稿は破棄されますが、belongs_to + dependentを設定するべきではないと思います:: destroy一緒に

実際、Facebookの例では、1つの投稿の1つのコメントが削除された場合、この投稿は削除されません