Ich aktualisiere ein System, um ein normalisierteres Datenbankschema zu haben. Derzeit haben wir eine builds
Tabelle mit einer user
Spalte, die einen Benutzernamen als Text speichert. Ich möchte eine user_id
Spalte und eine users
Tabelle hinzufügen und some_build.user
das Benutzermodell zurückgeben. Ziemlich einfach bis jetzt.Ersetzen Sie eine Spalte durch etwas anderes mit dem gleichen Namen, aber füllen Sie sie weiter
Leider sind die Tests auf dieser Codebasis weniger gründlich als Sie hoffen. Für den Fall, dass wir die Änderung rückgängig machen müssen, möchte ich weiterhin die alte user
Spalte ausfüllen. Ich habe versucht, setzen dieses in build.rb
:
alias_attribute :legacy_username, :user
before_save do
if changed_attributes.keys.include? 'user_id'
legacy_username = user.name
end
end
Ich hatte gehofft, es in die user
Spalte schreiben würde, während verlassen Build#user
am User
Modell zeigte. Leider legacy_username
endet Aliasing der user
Methode, nicht die user
Spalte - das heißt some_build.legacy_username
gibt User
zurück, und die Before_save-Hook ist nicht erfolgreich.
Gibt es eine Möglichkeit, dass ich dies koordinieren kann, während alles user
genannt wird, oder muss ich etwas umbenennen?