51

rubyonrails.org のスクリーンキャストをフォローしていました (ブログの作成)。

私は次のモデルを持っています:

コメント.rb

class Comment < ActiveRecord::Base
    belongs_to :post
    validates_presence_of :body # I added this
end

post.rb

class Post < ActiveRecord::Base
    validates_presence_of :body, :title
    has_many :comments
end

モデル間の関係は正常に機能しますが、1 つのことを除いては、投稿レコードを削除すると、関連するすべてのコメント レコードが RoR によって削除されることが予想されます。ActiveRecords はデータベースに依存しないことを理解しているため、外部キー、リレーション、ON DELETE、ON UPDATE ステートメントを作成する組み込みの方法はありません。では、これを達成する方法はありますか (RoR 自体が関連するコメントの削除を処理できるのでしょうか?)。

4

1 に答える 1

92

はい。Rails のモデルの関連付け:dependentでは、次の 3 つの形式のいずれかを取ることができるオプションを指定できます。

  • :destroy/:destroy_alldestroy関連付けられたオブジェクトは、メソッドを呼び出すことにより、このオブジェクトとともに破棄されます
  • :delete/:delete_all:destroy関連するすべてのオブジェクトは、メソッドを呼び出さずにすぐに破棄されます
  • :nullify関連するすべてのオブジェクトの外部キーは、コールバックNULLを呼び出さずに設定されますsave

関連付けが設定され:dependentている場合、このオプションは無視されることに注意してください。:has_many X, :through => Y

したがって、あなたの例では、投稿自体が削除されたときに、各コメントのdestroyメソッドを呼び出さずに、関連するすべてのコメントを投稿に削除させることを選択できます。それは次のようになります。

class Post < ActiveRecord::Base
  validates_presence_of :body, :title
  has_many :comments, :dependent => :delete_all
end

Rails 4 の更新:

Rails 4 では、:destroy代わりに を使用する必要があり:destroy_allます。

を使用する:destroy_allと、例外が発生します。

:dependent オプションは、[:destroy、:delete_all、:nullify、:restrict_with_error、:restrict_with_exception] のいずれかでなければなりません。

于 2009-12-13T15:28:36.453 に答える