我正在将项目升级到Rails 4.0.13(从3.2开始)。该项目具有现有模型实体和联系人。我简化了模型和数据库结构,以消除任何不相关的信息。
的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)错误:EntityTest#test_auto_create_new_contact:
ActiveRecord :: StaleObjectError:尝试更新过时的对象:实体
test / unit / entity_test.rb:9:在`block in test_auto_create_new_contact'中 test / unit / entity_test.rb:8:在`test_auto_create_new_contact'
我创建了一个新的简化项目来隔离问题以用于演示目的,我将其缩小到'composite_primary_keys'宝石。如果我从Gemfile中删除该行,我不会收到错误。但是,在实践中,删除Gem不是一种选择;项目的其他部分依赖于它。
答案 0 :(得分:0)
我找到了答案:在我的迁移中,我没有指定lock_version的默认值应为0,并且不允许空值:
t.integer :lock_version, null: false, default: 0