Bonjour,
Je suis en train de travailler sur mon premier projet Rails, et je suis
déjà agacé par des bugs ou limitations des migrations que je rencontre
avec MySQL. Je voulais savoir si vous rencontrez aussi ces soucis, et
s’il y a une solution élégante. Je suis en Rails 1.2.3, tous les paquets
sont en Gems, sur Ubuntu 7.04.
1) Problème avec add_column :
Il n’est pas possible de préciser après quelle colonne existante ajouter
la nouvelle colonne. La migration ajoute toujours la nouvelle colonne en
dernier.
MySQL sait le faire, mais je ne sais pas si c’est une extension au SQL
ou pas. J’ai regardé le code source dans Active Record et il n’y a aucun
moyen d’ajouter de paramètres à part ceux déjà définis.
J’ai contourné mon problème comme ceci, mais ça ne me semble pas élégant
:
class AddOrRenameFields < ActiveRecord::Migration
def self.up
# Champ 'name' manquant. On veut qu'elle soit ajoutée après le
champ 'sim'
# Cette commande ne convient pas : add_column :containers,
:name, :string, :limit => 64, :null => false
say_with_time("Adding column 'name' to 'containers'") do
execute "ALTER TABLE containers ADD COLUMN `name` VARCHAR(64)
NOT NULL AFTER `sim`"
end
[...]
end
Quelqu’un a-t-il mieux ? J’ai l’impression qui faudrait modifier la
méthode :
def add_column_options!(sql, options) #:nodoc:
sql << " DEFAULT #{quote(options[:default],
options[:column])}" if options_include_default?(options)
sql << " NOT NULL" if options[:null] == false
end
dans
/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/schema_statements.rb/
pour ajouter le support de “FIRST” ou “AFTER nom_de_colonne
”.
2) Problème avec rename_column :
Avec MySQL, quand je renomme une colonne, je perds tous les attributs !
Par exemple “NOT NULL” disparaît.
La faute en revient à ce bout de code dans
/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb/,
qui ne passe pas tous les paramètres possibles à “ALTER TABLE … CHANGE
…” :
def rename_column(table_name, column_name, new_column_name)
#:nodoc:
current_type = select_one("SHOW COLUMNS FROM #{table_name}
LIKE '#{column_name}'")["Type"]
execute "ALTER TABLE #{table_name} CHANGE #{column_name}
#{new_column_name} #{current_type}"
end
“SHOW COLUMNS” retourne toutes les infos qu’il faut pour reconstituer
“NULL” et la valeur par défaut, mais AR ne s’en sert pas. Donc j’ai dû
utiliser le code suivant :
class AddOrRenameFields < ActiveRecord::Migration
def self.up
[...]
# Le champ 'type' est réservé par Rails
# Attention, Rails perd les attributs d'une colonne renommée !!!
On doit les remettre à la main.
rename_column :objects_in_world, :type, :otype
change_column :objects_in_world, :otype, :string, :limit => 16,
:null => false
rename_column :objects_off_world, :type, :otype
change_column :objects_off_world, :otype, :string, :limit => 16,
:null => false
end
end
De même, quelqu’un a-t-il une solution élégante à proposer ?
Ou bien faut-il que je fasse des patchs ou bug reports ?
Cordialement,
–
Farzad FARID / Architecte Open Source - Associé
Pragmatic Source / http://www.pragmatic-source.com
Tel : +33 9 53 19 21 90 / Mob : +33 6 03 70 65 46
Rejoignez mon réseau de contacts :
http://www.viadeo.com/invitationpersonnelle/002ic6twokcvmi