Perché i binari non popolano una colonna autoincrementante nell'elemento restituito da una creazione? C'è un modo migliore per farlo?Perché activerecord non popola una colonna autoincrementante nell'elemento restituito da una creazione?
in Rails, quando si esegue a = Foo.create
poi a.id
è popolata
Ma se si dispone di un campo che è stato creato tramite
def up
execute "ALTER TABLE my_table ADD COLUMN my_auto_incrementing_column INTEGER AUTO_INCREMENT not null UNIQUE KEY;"
end
Poi quel campo non viene visualizzato quando si utilizza creare. Devi anche usare una ricarica.
a = Foo.create
a.id # not nil
a.my_auto_incrementing_column # nil
a.reload
a.my_auto_incrementing_column # is now populated
Informazioni Versione:
$ ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-darwin14.5.0]
$ bundle exec rails -v
Rails 3.2.12
$ mysql --version
mysql Ver 14.14 Distrib 5.6.26, for osx10.10 (x86_64) using EditLine wrapper
Alcuni retroscena:
Questo codice viene applicato ad un grande esistente rotaie base di codice in-produzione che richiede che tutti i campi siano id UUID. La colonna auto_increment non è una chiave primaria, perché è stata aggiunta dopo aver scoperto che un nuovo partner di integrazione esterno non poteva gestire utilizzando i nostri identificatori univoci lunghi (UUID) esistenti.
Stiamo lavorando per aggiornare la nostra versione di ruby, ma non vogliamo aspettarla come soluzione a questo problema. Inoltre, dopo aver letto i changelog in activerecord, non ho ancora la prova che qualsiasi versione futura di ruby / rails conterrà un bugfix per questo problema.
Il codice che voglio migliorare:
class Foo < ActiveRecord::Base
has_one :object_containing_auto_incrementing_column
def my_method
if self.object_containing_auto_incrementing_column.nil?
self.object_containing_auto_incrementing_column = ObjectContainingAutoIncrementingColumn.create(owner: self)
self.object_containing_auto_incrementing_column.reload
end
self.object_containing_auto_incrementing_column.my_auto_incrementing_column
end
end
Forse un duplicato di http://stackoverflow.com/a/9534482/531479 – CWitty
@CWitty http://stackoverflow.com/questions/9513739/generate-an-auto-increment-field-in-rails/9534482 # 9534482 è stato molto utile nel progettare questa soluzione, ma non spiega perché le rotaie abbiano questo bug o come aggirarlo. Inoltre è basato su postgres, quindi alcuni dei consigli hanno una sintassi che non si applica. – compiledwrong
Si prega di scoprire cosa 'SHOW CREATE TABLE' pensa che la tabella sia simile. Voglio vedere se activerecord ha tradotto correttamente ciò che ha detto il tuo codice. –