web-dev-qa-db-fra.com

Les rails génèrent la migration

J'ai actuellement une migration appelée Produits, et je veux simplement ajouter quelques chaînes supplémentaires à cette migration, telles que la description et le type de produit. Quelle est la meilleure façon de procéder? 

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.string  :name
      t.decimal :price
      t.text    :description
      t.timestamps
    end
   end
 end
38
Ivan Kutsarov

Juste courir 

Rails g migration add_description_to_products description:string
Rails g migration add_product_type_to_products product_type:string

puis courir 

rake db:migrate
60

Lors du développement de toute application pratique, vous effectuerez plusieurs migrations, qui sont essentiellement des instructions DDL (langage de définition de données). Dans la vraie vie, vous aurez plusieurs environnements (développement, test, production, etc.) et il est fort possible que vous changiez la base de données de développement pendant que vous avez une version en production. Pour cette raison, la méthode Rails consiste à générer une nouvelle migration pour toute modification apportée à la base de données au lieu d’apporter des modifications directes au fichier de migration existant.

Alors, familiarisez-vous avec les migrations.

Pour la question spécifique, vous pouvez faire:

Rails g migration add_attributes_to_products attr1 attr2 attr3

Cela générera un nouveau fichier de migration permettant d'ajouter 3 nouveaux attributs à la table products (dans le modèle Product). Le type par défaut pour les attributs est string. Pour d'autres, vous devez le spécifier comme suit:

Rails g migration add_attributes_to_products attr1:integer attr2:text attr3:enum
16
korada

En supposant que vous ayez créé la table avec la migration ci-dessus, ajoutez ensuite product_type (vous aviez déjà une description):

# db/migrate/20130201121110_add_product_type_to_product.rb

class AddProductTypeToProduct < ActiveRecord::Migration
  def change
    add_column :products, :product_type, :string
    Product.all.each do |product|
      product.update_attributes!(:product_type => 'unknown')
    end
  end
end
2
hwatkins

utilisez rollback si votre dernière action est migration

rake db:rollback

Ajoutez ensuite des attributs dans le fichier de migration 

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.string  :name
      t.decimal :price
      t.text    :description
      t.string  :product_type  #adding product_type attribute to the products table
      t.timestamps
    end
   end
 end

Après cela migrer en utilisant 

rake db:migrate

Si la migration n'est pas votre dernière action, générez un nouveau fichier de migration à partir de dans les réponses ci-dessus.

Rails g migration add_attributes_to_products product_type:string

Le code ci-dessus génère uniquement le fichier de migration, mais vous souhaitez utiliser rake db:migrate pour migrer le fichier. 

Si vous souhaitez apporter d'autres modifications à ce fichier de migration, telles que l'ajout d'attributs, faites-le avant de migrer, sinon vous devez utiliser la méthode que j'ai mentionnée au début si votre dernière action est la migration ou vous devez générer un autre fichier de migration cliquez sur ce lien pour en savoir plus sur la migration http://guides.rubyonrails.org/v3.2.8/migrations.html

1
vinoth

Les Rails génèrent la migration add_description_to_products 

AddDescriptionToProducts < ActiveRecords:: Migration[v]
  def change
    add_column :products :description :string
    add_column :name_of_table :name_of_column :data_type
  end

lancez rake db: migrate et votre schema.rb sera mis à jour automatiquement

0
Chopper