私のプロジェクトには定型文のコピーがたくさんあります。
class Project < ActiveRecord::Base
has_many :boilerplate_copies, dependent: :destroy
end
class BoilerplateCopy < Boilerplate
belongs_to :project, counter_cache: true
belongs_to :boilerplate_original
end
私は次の仕様を持っています:
it 'destroys associated boilerplate copies' do
project = Project.create! name: 'my project', customer: 'some customer'
project.boilerplate_copies.create! title: 'my boilerplate'
expect {
project.destroy
}.to change { BoilerplateCopy.count }.by -1
end
失敗します:
Failure/Error: project.destroy
ActiveRecord::StaleObjectError:
Attempted to destroy a stale object: Project
関連付けられたオブジェクトが作成されると、DB で lock_version フィールドが更新されることがわかりましたが、ruby オブジェクトはこれを認識しません。したがって、を追加するproject.reload
と、仕様は次のようになります。
it 'destroys associated boilerplate copies' do
project = Project.create! name: 'my project', customer: 'some customer'
project.boilerplate_copies.create! title: 'my boilerplate'
project.reload
expect {
project.destroy
}.to change { BoilerplateCopy.count }.by -1
end
この動作は予期されたものですか? カウンターキャッシュと関係がありますか?