2016-07-06 6 views
0

Ich habe ein Rails-Modell, das ein nicht standardmäßiges boolesches Feld hat, das nullwertfähig ist und versucht, einen Standardwert festzulegen. Ich habe einen Blogbeitrag über die Vermeidung eines booleschen 3-stat-Problems gefunden und versuche, dies zu berücksichtigen. Dies ist die Migration ich habe:Schienenmigration fügt dem vorhandenen booleschen Feld Standard-NULL-Eigenschaften hinzu

def change 
    change_column :table, is_foo, :boolean, null: false, default: false 
end 

die Migration Lauf aufgrund bestehender Nullwerte in der Datenbank fehlschlägt. Was ist der richtige Weg, um bestehende Einträge zu aktualisieren, damit das Schema geändert werden kann? Oder sollte das nicht null Kontrolle zum Modell hinzugefügt werden:

validates :is_foo, presence: true 

nicht sicher, ob das Hinzufügen dieser zu der Migration ist die „richtige“ Art und Weise:

Table.update_all(:is_foo => false) 

Ähnlich dieser Bereich durch eine Migration hinzugefügt wurde ohne extra not null/default Parameter. Würde die Migration zum Hinzufügen einer Spalte dies ebenfalls erfordern, oder würde der Standardwert den Wert festlegen? Hier ist die Migration Ich lief:

add_column :table, is_foo, :boolean 

Wenn ich ,null: false, default: false auf dem add_column hinzugefügt hätte, hätte alle Werte richtig eingestellt sind?

Antwort

1

Man könnte es auf diese Weise tun:

class UpdateFoo < ActiveRecord::Migration 
    def change 
    reversible do |direction| 
     direction.up { 
     Table.where(is_foo: nil).update_all(is_foo: false) 
     } 
    end 
    change_column :table, is_foo, :boolean, null: false, default: false 
    end 
end 

Wenn bis Migration wird es zunächst sicherstellen, dass alle nulls die Spalte falsch und dann Änderung umgewandelt werden Ihre Einschränkungen hinzuzufügen.

Und ja, Sie hätten dies vermeiden können, wenn die erste Migration die Einschränkungen enthalten würde.

Ich denke, Sie haben auch Recht, die Modellvalidierung hinzuzufügen.

0

Sie können die Methoden change_column_null und change_column_default kombinieren, um dies bei einer Migration zu erreichen.

  1. Die change_column_null Methode können Sie eine NICHT NUL L Einschränkung hinzufügen, mit dem letzten Argument spezifiziert, was jede bestehende NULL mit Werte zu ersetzen.

  2. Die change_column_default setzt dann den Standardwert für neue Datensätze.

class UpdateTable < ActiveRecord::Migration 
    def change 
    change_column_null :table, :is_foo, false, false 
    change_column_default :table, :is_foo, false 
    end 
end 
Verwandte Themen