Я обновляю проект до Rails 4.0.13 (из 3.2). Проект имеет существующие модели Entity and Contact. Я упростил модели и структуру базы данных, чтобы устранить любую несвязанную информацию.ActiveRecord :: StaleObjectError для объекта с ассоциацией has_one и accepts_nested_attributes_for - конфликт с gem 'composite_primary_keys'
Gemfile:
source 'http://rubygems.org'
gem 'rails', '4.0.13'
gem 'mysql2', '~> 0.3.x'
gem 'composite_primary_keys'
Миграция:
class CreateEntities < ActiveRecord::Migration
def change
create_table :entities do |t|
t.string :name
t.integer :lock_version
t.timestamps
end
end
end
class CreateContacts < ActiveRecord::Migration
def change
create_table :contacts do |t|
t.integer :entity_id
t.integer :contact_type_id
t.string :name
t.integer :lock_version
t.timestamps
end
end
end
Модель:
class Entity < ActiveRecord::Base
has_one :contact, -> { where contact_type_id: 1 }
accepts_nested_attributes_for :contact
end
class Contact < ActiveRecord::Base
belongs_to :entity
belongs_to :entity_contact_type
end
entities_test.rb:
require 'test_helper'
class EntityTest < ActiveSupport::TestCase
def test_auto_create_new_contact
entity = entities(:one)
entity.contact_attributes = { :name => 'new name' }
assert_difference 'Contact.count' do
entity.save
assert_equal 'new name', entity.contact.name
assert !entity.contact.new_record?
end
end
end
Когда я бег entities_test, я получаю следующее сообщение об ошибке:
1) Error: EntityTest#test_auto_create_new_contact:
ActiveRecord::StaleObjectError: Attempted to update a stale object: Entity
test/unit/entity_test.rb:9:in `block in test_auto_create_new_contact' test/unit/entity_test.rb:8:in `test_auto_create_new_contact'
я создал новый упрощенный проект, чтобы изолировать проблему для демонстрационных целей, и я сузил это вплоть до драгоценного камня «composite_primary_keys». Если я удалю эту строку из Gemfile, я не получу ошибку. Однако на практике удаление этого драгоценного камня не является вариантом; есть другие части проекта, которые зависят от него.