0

Я обновляю проект до 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, я не получу ошибку. Однако на практике удаление этого драгоценного камня не является вариантом; есть другие части проекта, которые зависят от него.

ответ

0

Я нашел ответ: в моей миграции я не смог определить, что lock_version должен иметь значение по умолчанию, равное 0, и не допускает пустых значений:

t.integer :lock_version, null: false, default: 0 

 Смежные вопросы

  • Нет связанных вопросов^_^