具有has_one关联和accepts_nested_attributes_for的对象上的ActiveRecord :: StaleObjectError - 与gem' composite_primary_keys'冲突

时间:2015-03-30 23:56:35

标签: ruby ruby-on-rails-4 nested-attributes composite-primary-key optimistic-locking

我正在将项目升级到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不是一种选择;项目的其他部分依赖于它。

1 个答案:

答案 0 :(得分:0)

我找到了答案:在我的迁移中,我没有指定lock_version的默认值应为0,并且不允许空值:

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