it-swarm.com.de

Hinzufügen: default => true für boolean in der vorhandenen Rails-Spalte

Ich habe hier auf SO einige Fragen (nämlich dieses ) über das Hinzufügen eines Standard-Booleschen Werts zu einer vorhandenen Spalte gesehen. Also habe ich den change_column-Vorschlag ausprobiert, aber ich darf es nicht richtig machen.

Ich habe es versucht:

$ change_column :profiles, :show_attribute, :boolean, :default => true

Welche gibt -bash: change_column: command not found zurück

Ich lief dann:

$ Rails g change_column :profiles, :show_attribute, :boolean, :default => true

...und

$ Rails change_column :profiles, :show_attribute, :boolean, :default => true

Dann lief rake db:migrate, aber der Wert für :show_attribute blieb nil. In der oben genannten Frage heißt es in PostgreSQL, dass Sie es manuell aktualisieren müssen. Da ich PostgreSQL verwende, habe ich Folgendes in meine create_profiles-Migration eingefügt:

t.boolean :show_attribute, :default => true

Kann mir jemand sagen, was ich hier falsch mache?

144
tvalent2

change_column ist eine Methode von ActiveRecord::Migration, Sie können sie also nicht in der Konsole so nennen.

Wenn Sie einen Standardwert für diese Spalte hinzufügen möchten, erstellen Sie eine neue Migration:

Rails g migration add_default_value_to_show_attribute

Dann in der Migration erstellt:

def up
  change_column :profiles, :show_attribute, :boolean, default: true
end

def down
  change_column :profiles, :show_attribute, :boolean, default: nil
end

Führen Sie dann rake db:migrate aus.

An den bereits erstellten Datensätzen ändert sich nichts. Dazu müssen Sie einen rake task erstellen oder einfach den Rails console eingeben und alle Datensätze aktualisieren.

Wenn Sie t.boolean :show_attribute, :default => true zur create_profiles-Migration hinzugefügt haben, ist es normal, wenn nichts unternommen wird. Es werden nur Migrationen ausgeführt, die noch nicht ausgeführt wurden. Wenn Sie mit einer neuen Datenbank begonnen haben, wird der Standardwert auf true gesetzt.

294
Robin

Als Variation der akzeptierten Antwort können Sie auch die Methode change_column_default in Ihren Migrationen verwenden:

def up
  change_column_default :profiles, :show_attribute, true
end

def down
  change_column_default :profiles, :show_attribute, nil
end

Rails API-Dokumente

92

Ich bin nicht sicher, wann dies geschrieben wurde, aber derzeit können Sie zum Hinzufügen oder Entfernen eines Standards aus einer Spalte in einer Migration Folgendes verwenden:

change_column_null :products, :name, false

Schienen 5:

change_column_default :products, :approved, from: true, to: false

http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns

Schienen 4.2: 

change_column_default :products, :approved, false

http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns

Auf diese Weise können Sie vermeiden, dass Sie Ihre Migrationen oder Ihr Schema nach den Spaltenspezifikationen durchsuchen.

30
fbelanger
change_column :things, :price_1, :integer, default: 123, null: false

Es scheint die beste Methode zu sein, einer vorhandenen Spalte einen Standard hinzuzufügen, der null: false noch nicht enthält.

Andernfalls:

change_column :things, :price_1, :integer, default: 123

Einige Recherchen dazu habe ich gemacht:

https://Gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b

0
Dorian

Wenn Sie gerade eine Migration durchgeführt haben, können Sie ein Rollback durchführen und dann die Migration erneut durchführen.

Zum Zurücksetzen können Sie so viele Schritte ausführen, wie Sie möchten:

rake db:rollback STEP=1

Dann können Sie die Migration einfach noch einmal durchführen:

def change
  add_column :profiles, :show_attribute, :boolean, default: true
end

Vergiss nicht rake db:migrate und wenn du heroku heroku run rake db:migrate verwendest

0
Bruno M

Auch nach dem Dokument:

standard kann nicht über die Befehlszeile angegeben werden

https://guides.rubyonrails.org/active_record_migrations.html

Es gibt also keinen vorgefertigten Rails-Generator. Wie in den obigen Antworten angegeben, müssen Sie Ihre Migrationsdatei manuell mit der Methode change_column_default füllen.

Sie könnten Ihren eigenen Generator erstellen: https://guides.rubyonrails.org/generators.html

0
Margotte