Hier ist ein minimaler Testfall, der die Grundlage für meine Frage bildet. Warum wird user
korrekt gespeichert, obwohl das Attribut user.id
nicht aktualisiert wird? Der Versuch, den Datensatz in der Datenbank erneut zu finden, ruft ihn ohne Fehler ab, und das Attribut id
wird ordnungsgemäß festgelegt.Composite Primärschlüssel nicht nach Speichern aktualisieren
AFAICT, es handelt sich nicht darum, einen zusammengesetzten Primärschlüssel in sqlite automatisch zu inkrementieren. Das gleiche Problem tritt auch bei der UUID/PostgreSQL-Kombination auf. Das Schema hat nur id
als Primärschlüssel, wobei [ :account_id, :id ]
ein separater eindeutiger Index ist.
#!/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}"
Und das Ergebnis dieses Skript ausgeführt ist:
~/src
[email protected](ttys005)[4146] % ./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>
nicht sein sollte user.id [1,1]
nach dem ersten retten? Wenn dies ein Fehler ist, an wen sollte ich ihn melden?
Ich wollte nur einen Daumen für tatsächlich bis geben ein funktionierendes Beispiel in einer einzigen Datei zu geben, möchte ich mehr Fragen waren diese fokussiert. – Iceman
Vielen Dank, aber vielen Dank an Jon Leighton für das Schreiben dieses ausgezeichneten Beitrags. http://www.jonathaneighton.com/articles/2011/awesome-active-record-bug-reports/ –