17

私はbelongs_toメソッドのオプションをチェックし、Rails3.2.7で次の動作をテストしています。

上記のリンクのように、:dependentオプションは次のように述べています

:destroyに設定すると、このオブジェクトが破棄されるときに、関連付けられたオブジェクトが破棄されます。:deleteに設定すると、関連付けられたオブジェクトは、destroyメソッドを呼び出さずに削除されます。

私が理解しているように、次の場合に投稿が削除された場合は、作成者を削除する必要があります。

class Post < ActiveRecord::Base
  belongs_to :author, :dependent => :delete
end

class Author < ActiveRecord::Base
  attr_accessible :name
  has_one :post

  before_destroy :log_author_removal

  private
    def log_author_removal
      logger.error('Author is getting removed')
    end

end

コンソールの場合:

> Post.first
  Post Load (0.4ms)  SELECT "posts".* FROM "posts" LIMIT 1
 => #<Post id: 5, title: "Post 5", author_id: 3>
> p.delete
  SQL (197.7ms)  DELETE FROM "posts" WHERE "posts"."id" = 5
 => #<Post id: 5, title: "Post 5", author_id: 3> 
> Author.find(3)
  Author Load (0.5ms)  SELECT "authors".* FROM "authors" WHERE "authors"."id" = ? LIMIT 1  [["id", 3]]
 => #<Author id: 3, name: "Author 3"> 

ただし、呼び出すと、p.destroy関連付けられた作成者が削除されます。

私は引用された声明の上で誤解されていますか?

4

5 に答える 5

25

はい、delete通常、呼び出しは、あなたまたはRailsがレコードの破棄に設定したすべてのコールバックをスキップします。これらには、before_destroy関連するレコードのようなコールバックや破棄も含まれます。

したがって、呼び出すp.deleteと、関連するレコードに対して何も実行されません。

あなたがそれを呼ぶときp.destroyそれはするでしょう:

  1. 設定されている場合は、before_destroyコールバックを呼び出します。
  2. オブジェクトを削除します。
  3. を設定:dependent => :deleteすると、Authorオブジェクトが削除されます。これを設定すると:destroy、作成者オブジェクトに対してこのプロセス全体が繰り返されます(該当する場合は、コールバックと関連レコードの破棄)。
  4. 設定されている場合は、after_destroyコールバックを呼び出します。
于 2012-09-17T12:05:21.740 に答える
7

私が理解していることから:

:dependent => :destroyassociation.destroyオブジェクトを呼び出すとトリガーdestroyされます。

:dependent => :deleteassociation.deleteオブジェクトを呼び出すとトリガーdestroyされます。

どちらの場合も、destroy親オブジェクトを呼び出す必要があります。違いは、子オブジェクトで呼び出される方法にあります。子オブジェクトで破棄フィルターをトリガーしたくない場合は、を使用します:dependent => :delete。それらが必要な場合は、を使用してください:dependent => :destroy

ここでソースをすばやく確認してください:https ://github.com/rails/rails/blob/357e288f4470f484ecd500954fd17fba2512c416/activerecord/lib/active_record/associations/builder/belongs_to.rb#L68

依存関係を呼び出すと、親モデルにafter_destroyが作成され、子オブジェクトまたは子オブジェクトのいずれdeletedestroyが呼び出されることがわかります。ただし、どちらの場合も、を作成しafter_destroyます。

于 2012-09-17T12:24:22.677 に答える
2

所属_toアソシエーションは、:dependentの:delete:destroyの両方をサポートします。以下のリンクを参照できます http://apidock.com/rails/v4.0.2/ActiveRecord/Associations/ClassMethods/belongs_to

deleteを呼び出すと、before_destroyなどのすべてのコールバックがスキップされ、関連付けオブジェクトの関連付けられたレコードも削除されません。

class Order < ActiveRecord::Base
has_one :project, :dependent => :delete
has_many :resources, :dependent => :delete
end

class Project < ActiveRecord::Base
belongs_to :order, :dependent => :delete
end

上記のコードでは、プロジェクトが破棄された場合、順序も削除されますが、順序のリソースは削除されませんが、

belongs_to :order, :dependent => :destroy

次に、注文に添付されたリソースもプロジェクトの破棄時に削除されます。

于 2014-08-30T13:56:32.660 に答える
1
 belongs_to :author, :dependent => :delete

次のようになります:belongs_to:author、:dependent =>:destroy

:destroyと:deleteはActiveRecordで異なる動作をし、deleteは検証とARの関連付けをバイパスするため、関連付けられたオブジェクトは削除されません。

于 2012-09-17T12:01:26.160 に答える
-1

所属するアソシエーションは、 :depedentの:deleteをサポートできません。:destroyのみをサポートします。このリンクhttp://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.htmlを参照してください。

于 2012-09-17T12:06:00.540 に答える