web-dev-qa-db-fra.com

Dans une Rails Migration (MySQL), pouvez-vous spécifier la position d'une nouvelle colonne?

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?

55
yalestar

Ceci est désormais possible dans Rails 2.3.6+ en passant le paramètre: after

https://Rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations

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.

62
Gabe Martin-Dempesy

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.

  1. Tapez Rails g migration AddGenderToUser gender:string
  2. 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
    
25
Tamik Soziev

J'ai créé un correctif qui ajoute cette fonctionnalité supplémentaire à l'adaptateur ActiveRecord Mysql. Cela fonctionne pour master et 2-3-stable.

https://Rails.lighthouseapp.com/projects/8994/tickets/3286-patch-add-support-for-mysql-column-positioning-to-migrations

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).

8
Ben Marini

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
5
Bill Karwin

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.

1
Mike Woodhouse