90 votes

Rails Migrations: Vérifier l'existence et continuer?

Je faisais ce genre de chose dans mon migrations:

add_column :statuses, :hold_reason, :string rescue puts "column already added"

mais il s'avère que, bien que cela fonctionne pour SQLite, il ne fonctionne pas pour PostgreSQL. Il semble comme si le add_column explose, même si l'Exception est interceptée, la transaction est mort et donc la Migration ne peut pas faire tout le travail supplémentaire.

Est-il un non-DB sepecific façons de vérifier si une colonne ou une table existe déjà? À défaut, est-il possible d'obtenir mon secours bloc pour vraiment travailler?

193voto

Tobias Cohen Points 14390

A partir de Rails 3.0 et versions ultérieures, vous pouvez utiliser column_exists? pour vérifier l'existence d'une colonne.

 unless column_exists? :statuses, :hold_reason
  add_column :statuses, :hold_reason, :string
end
 

Il existe également une fonction table_exists? , qui remonte aussi loin que Rails 2.1.

10voto

SG 86 Points 2460

Ou même plus court

 add_column :statuses, :hold_reason, :string unless column_exists? :statuses, :hold_reason
 

4voto

JellicleCat Points 4694

Pour Les Rails 2.X, vous pouvez vérifier l'existence de colonnes avec les éléments suivants:

columns("[table-name]").index {|col| col.name == "[column-name]"}

Si elle renvoie nil, aucune colonne de ce type n'existe. Si elle renvoie un Fixnum, puis la colonne n'existe pas. Naturellement, vous pouvez mettre plus sélective des paramètres entre l' {...} si vous souhaitez identifier une colonne par plus que juste son nom, par exemple:

{ |col| col.name == "foo" and col.sql_type == "tinyint(1)" and col.primary == nil }

(cette réponse postée sur Comment écrire conditionnelle migrations dans les rails?)

0voto

Denis Neverov Points 1

add_column: statuses,: hold_reason,: string sauf si Status.column_names.include? ("hold_reason")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X