Müssen Sie wirklich die Datenbank dafür ändern? Eine mögliche Lösung besteht darin, nur eine Wrapper-Methode zu erstellen, die dies für Sie übernimmt. Nehmen wir an, Sie haben eine boolesche Spalte mit dem Namen , dann könnten Sie einfach eine Wrappermethode schreiben, die diese Logik transparent verarbeitet, ohne die zugrunde liegende Datenbank zu ändern.
im Modell Active:
def mycol
read_attribute(:boolcol) ? 1 : 2
end
def mycol=(value)
write_attribute(:mycol, value == 1)
end
So zum Beispiel u.mycol = 1 && u.save
läuft in die Datenbank schreiben würde false
und u.reload.mycol würde 1.
jedoch zurückkehren, wenn es wirklich notwendig ist, zu tun Eine Migration erstellt dann eine neue Ganzzahlspalte, um die ursprüngliche boolesche Spalte zu ersetzen. Entfernen oder ändern Sie die vorhandene Spalte nicht, um sicherzustellen, dass Sie keine Daten beschädigen oder zerstören.
Erstellen Sie nach dem Erstellen der neuen Spalte eine Rake-Task, um alle vorhandenen Datensätze zu durchlaufen (verwenden Sie die Methode find_each
für die Iteration), und legen Sie den ganzzahligen Wert für die neue Spalte basierend auf dem Wert der ursprünglichen booleschen Spalte fest. Nachdem Sie die Integrität der Daten überprüft haben, können Sie die ursprüngliche boolesche Spalte löschen und durch die neu erstellte Spalte ersetzen.
Das klingt wie ein XY-Problem, wo Sie nach Y fragen, aber sollten nach X gefragt haben, was zu Y führte. Mit anderen Worten, Sie sollten nach dem Schema und den Daten fragen, die Sie speichern und warum, anstatt zu modifizieren die Tabelle und versuchen, Wahr und Falsch zu ganzen Zahlen zu bilden, dann das gleiche Feld für andere Dinge zu verwenden. –