現在、製品と呼ばれる移行を行っていますが、この移行に説明や製品タイプなどの文字列をいくつか追加したいだけです。これを行う最良の方法は何ですか?
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
ただ走れ
Rails g migration add_description_to_products description:string
Rails g migration add_product_type_to_products product_type:string
そして、実行します
rake db:migrate
実用的なアプリケーションの開発では、基本的に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
最後のアクションが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
上記の移行でテーブルを作成したと仮定して、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
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が自動的に更新されます