Si j'ajoute une colonne via MySQL, je peux spécifier où dans la table cette colonne utilisera le modificateur AFTER. Mais si je fais l'add_column via une migration Rails, la colonne sera créée à la fin du tableau.
Existe-t-il une fonctionnalité pour les migrations Rails pour spécifier la position d'une colonne ajoutée?
Ceci est désormais possible dans Rails 2.3.6+ en passant le paramètre: after
Pour tous ceux qui ne voient pas l'avantage d'avoir cette fonctionnalité: ne regardez-vous jamais votre base de données en dehors de l'ORM? Si je visualise dans une sorte d'interface utilisateur, j'aime avoir des choses comme les clés étrangères, les colonnes d'état, les drapeaux, etc., tous regroupés. Cela n'affecte pas l'application, mais accélère définitivement ma capacité à examiner les données.
Sûr que vous pouvez.
Réponse courte:
add_column :users, :gender, :string, :after => :column_name
Longue réponse:
Voici un exemple, disons que vous voulez ajouter une colonne appelée "gender" après la colonne "sername" à "sers" table.
Rails g migration AddGenderToUser gender:string
Ajoutez "après =>: nom d'utilisateur" dans la migration qui a été créée pour qu'elle ressemble à ceci:
class AddSlugToDictionary < ActiveRecord::Migration
def change
add_column :users, :gender, :string, :after => :username
end
end
J'ai créé un correctif qui ajoute cette fonctionnalité supplémentaire à l'adaptateur ActiveRecord Mysql. Cela fonctionne pour master et 2-3-stable.
Cela peut être spécifique à mysql, mais cela ne rend pas vos migrations moins portables (d'autres adaptateurs ignoreraient simplement les options de positionnement supplémentaires).
Il ne semble pas y avoir d'option de position pour le add_column
méthode dans les migrations. Mais les migrations prennent en charge l'exécution de SQL littéral. Je ne suis pas Rails développeur, mais quelque chose comme ceci:
class AddColumnAfterOtherColumn < ActiveRecord::Migration
def self.up
execute "ALTER TABLE table_name ADD COLUMN column_name INTEGER
AFTER other_column"
end
def self.down
remove_column :table_name, :column_name
end
end
Il n'y a aucun moyen dans Rails de spécifier la position d'une colonne. En fait, je pense que ce n'est qu'une coïncidence (et donc ne pas être fiable) que les colonnes sont créées dans l'ordre dans lequel elles sont nommées dans une migration.
L'ordre des colonnes dans une table est presque pertinent et devrait l'être: la "raison" commune donnée est de pouvoir voir un sous-ensemble particulier lors de l'exécution d'un "SELECT *", mais ce n'est vraiment pas une bonne raison.
Toute autre raison est probablement une odeur de conception, mais j'aimerais connaître une raison valable pour laquelle je me trompe!
Sur certaines plates-formes, il y a un espace (minuscule) et une économie de performances à obtenir en mettant les colonnes avec la plus forte probabilité d'être NULL à la fin (parce que le DMBS n'utilisera pas d'espace disque pour "traîner" les valeurs NULL, mais je pensez que vous devez utiliser le matériel des années 80 pour le remarquer.