私はrubyonrails.orgのスクリーンキャストをフォローしていました(ブログを作成しています)。
私は次のモデルを持っています:
comment.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自体が関連するコメントの削除を処理できるでしょうか?)
はい。 Railsのモデルの関連付けでは、:dependent
オプションを指定できます。これは、次の3つの形式のいずれかになります。
:destroy/:destroy_all
関連付けられたオブジェクトは、destroy
メソッドを呼び出すことにより、このオブジェクトとともに破棄されます: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では、:destroy
ではなく:destroy_all
を使用する必要があります。
:destroy_all
を使用すると、例外が発生します。
:dependentオプションは[:destroy、:delete_all、:nullify、:restrict_with_error、:restrict_with_exception]のいずれかである必要があります