web-dev-qa-db-fra.com

Rails: migration pour créer une colonne char (12) de longueur fixe

Quelle est la meilleure façon de définir une colonne SQL de longueur fixe (CHAR (12) par exemple) via une migration Rails?

Pourquoi cela ne devrait pas être géré par le modèle en raison des performances de char () vs varchar (), et j'aimerais éviter d'injecter du SQL brut dans la base de données.

Edit: je connais le modificateur: limit, mais le champ est toujours varchar (ce qui est mauvais pour les performances) et ne permet pas une taille minimale.

33
manu_v

Si Rails ne comprend pas le type de colonne, il le transmettra directement à la base de données. Donc, si vous voulez un caractère au lieu de varchar, remplacez simplement:

t.column :token, :string

Avec:

t.column :token, "char(12)"

Bien sûr, cela peut ou non rendre vos migrations non portables vers une autre base de données.

(crédit à http://laurelfan.com/2010/1/26/special-mysql-types-in-Rails-migrations )

49
KenB
 def self.up
    add_column("admin_users", "username", :string, :limit => 25)
 end

 def self.down
    remove_column("admin_users", "username")
 end
26
demas

Vous pouvez utiliser le type de chaîne avec l'option limit dans votre fichier de migration comme ceci:

t.string :name, :limit => 12, :null => false
8
Ashish

Pour un type spécifique de base de données, nous pouvons désormais utiliser:

t.column(:column_name, 'char(12)')

Et pour un exemple complet:

class Foo < ActiveRecord::Migration
  def change
     create_table :foo do |t|
       t.column(:column_name, 'custom_type')

       t.timestamps
     end
  end
end
6
meoww-