【发布时间】:2017-09-04 06:44:34
【问题描述】:
这是构成我的问题基础的最小测试用例。为什么即使user 已正确保存,属性user.id 也没有更新?尝试在数据库中重新查找记录会毫无问题地获取它,并且 id 属性已正确设置。
AFAICT,这不是尝试在 sqlite 中自动增加复合主键的问题。 uuid/PostgreSQL 组合也会出现同样的问题。该架构只有 id 作为主键,[ :account_id, :id ] 是一个单独的唯一索引。
#!/usr/bin/env ruby
gem "rails", "~> 5.0.2"
gem "composite_primary_keys"
require "active_record"
require "composite_primary_keys"
ActiveRecord::Base.establish_connection(
adapter: "sqlite3",
database: ":memory:"
)
ActiveRecord::Schema.define do
create_table :accounts, force: true do |t|
end
create_table :users, force: true do |t|
t.references :account
t.index [ :account_id, :id ], unique: true
end
end
class User < ActiveRecord::Base
self.primary_keys = [ :account_id, :id ]
belongs_to :account, inverse_of: :users
end
class Account < ActiveRecord::Base
has_many :users, inverse_of: :account
end
account = Account.create!
puts "created account: #{account.inspect}"
user = account.users.build
puts "before user.save: #{user.inspect}"
user.save
puts "after user.save: #{user.inspect}"
puts "account.users.first: #{account.users.first.inspect}"
而运行该脚本的结果是:
~/src
% ./cpk-test.rb
-- create_table(:accounts, {:force=>true})
-> 0.0036s
-- create_table(:users, {:force=>true})
-> 0.0009s
created account: #<Account id: 1>
before user.save: #<User id: nil, account_id: 1>
after user.save: #<User id: nil, account_id: 1>
account.users.first: #<User id: 1, account_id: 1>
第一次保存后 user.id 不应该是 [1,1] 吗?如果这是一个错误,我应该向谁报告?
【问题讨论】:
-
我只是想为在单个文件中实际给出一个工作示例而竖起大拇指,我希望更多的问题是这样集中的。
-
谢谢你,但非常感谢 Jon Leighton 写了这篇出色的文章。 jonathanleighton.com/articles/2011/…
标签: ruby-on-rails rails-activerecord composite-primary-key