web-dev-qa-db-ja.com

Rails Migrationを生成

現在、製品と呼ばれる移行を行っていますが、この移行に説明や製品タイプなどの文字列をいくつか追加したいだけです。これを行う最良の方法は何ですか?

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
46
Ivan Kutsarov

ただ走れ

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

そして、実行します

rake db:migrate
68

実用的なアプリケーションの開発では、基本的にDDL(データ定義言語)ステートメントであるかなりの数の移行を行うことになります。実際には、いくつかの環境(開発、テスト、実稼働など)があり、実稼働中のバージョンがある間に開発データベースを変更する可能性が高くなります。このため、Railsの方法は、既存の移行ファイルに直接変更を加える代わりに、データベースへの変更に対して新しい移行を生成することです。

したがって、移行に慣れてください。

特定の質問については、次のことができます。

Rails g migration add_attributes_to_products attr1 attr2 attr3

これにより、3つの新しい属性を製品テーブルに(製品モデルに)追加するための新しい移行ファイルが生成されます。属性のデフォルトのタイプはstringです。その他の場合は、次のように指定します。

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

最後のアクションがrollbackの場合はmigrationを使用します

rake db:rollback

次に、移行ファイルに属性を追加します

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

その後、次を使用して移行します

rake db:migrate

移行が最後のアクションではない場合、上記の回答の時点で新しい移行ファイルを生成します

Rails g migration add_attributes_to_products product_type:string

上記のコードは移行ファイルのみを生成しますが、rake db:migrateファイルを移行します。

移行前に属性を追加するなど、移行ファイルにさらに変更を加えたい場合は、最後のアクションが移行であるか、別の移行ファイルを生成する必要がある場合、冒頭で述べた方法を使用する必要があります。移行の詳細については、このリンクを確認してください http://guides.rubyonrails.org/v3.2.8/migrations.html

2
vinoth

上記の移行でテーブルを作成したと仮定して、product_typeを追加するには(説明がすでにある)次のようにします。

# 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

Railsは移行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

rake db:migrateを実行すると、schema.rbが自動的に更新されます

0
Chopper