2016-11-04 2 views
0

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?

Antwort

0

Aha! Stellt sich heraus, Sie Datenbankwerte direkt ActiveRecord::Base#[]= einstellen mit:

before_save do 
    if changed-attributes.keys.include? 'user_id' 
    self[:user] = username 
    end 
end 

Kein Alias ​​erforderlich.

Verwandte Themen