1

私のプロジェクトには定型文のコピーがたくさんあります。

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

この動作は予期されたものですか? カウンターキャッシュと関係がありますか?

4

1 に答える 1

1

次のRailsの問題に関係しているようです:

https://github.com/rails/rails/issues/16449

私の問題を説明するコメントをそこに追加しました。解決策があれば、この回答を更新します。

于 2015-12-14T12:40:58.393 に答える