2009-09-20 5 views
1

Je dois créer un schéma de base de données avec des migrations Rails.Est-il possible d'utiliser un type de colonne personnalisé dans une migration Rails?

J'ai beaucoup de colonnes qui contiennent des quantités (kg) et des prix (devise).

Actuellement, j'utiliser ceci:

t.column :quantity, :decimal, :precision => 6, :scale => 3 
    t.column :value, :decimal, :precision => 6, :scale => 2 

A l'appel du générateur que j'utilise quantity:decimal pour identifier mes colonnes. Ensuite, je modifie manuellement les lignes t.decimal générées à ce qui précède.

Je n'aime pas ça, car après chaque migration générée, je dois manuellement éditer le script de migration et je m'inquiète de DRY. (Si le prix doit contenir quatre au lieu de deux décimales?)

Est-il possible de créer un type de colonne personnalisée que je peux utiliser dans les migrations et peut-être même des générateurs, comme ceci:

t.quantity :quantity 
    t.price :value 

PS: Je suis un Rails noob, je suis désolé si c'est une question stupide.

+0

Que voulez-vous dire par «avoir à réparer manuellement le script de migration»? – hgmnz

+0

Pour l'instant j'utilise simplement "quantité: décimal" dans l'appel du générateur. Ensuite, je dois éditer le script de migration généré et changer le "t.decimal: quantity" à l'exemple ci-dessus. (Utilisez le type de colonne générique, ajoutez les paramètres de précision) –

Répondre

1

Je suis sûr que vous pouvez faire ce que vous demandez-- creuser dans la méthode de colonne dans le code de migrations-- mais je ne pense pas qu'il est pris en charge naturellement. Je pense que l'idée avec les migrations est qu'elles sont assez proches du langage des bases de données (et plus loin de votre modèle de domaine), donc le support est assez centré sur la base de données.

Examinez l'utilisation de with_options (railscasts.com/episodes/42-with-options). Cela vous permettra de sécher une seule migration sans patcher les rails.

Vous pouvez également créer des méthodes d'assistance dans la migration qui l'éteint. Je le fais tout le temps ... la migration est juste une classe Ruby, vous pouvez donc créer:

monnaie def (colonne) add_column: my_table, colonne: déci ... etc.

2

Juste un suivi: J'ai fini par Rails-patcher singe:

class ActiveRecord::ConnectionAdapters::TableDefinition 

    def price(*args) 
    options = args.extract_options! 
    options.reverse_merge!({ precision: 8, scale: 2 }) 
    column_names = args 
    type = :decimal 
    column_names.each { |name| column(name, type, options) } 
    end 

end 

Cela me permet d'utiliser price comme un type de colonne, qui se traduit par une migration propre avenir.

create_table :stuff do |t| 
    t.price :my_price 
end 
Questions connexes