2

Rails 3 での "migrate" のドキュメント ( Rails 3.0 Relese Notes Migrate ) は既に読みましたが、いくつか疑問があります。

たとえば、次の 2 つのクラスを作成しました。

rails generate scaffold User name:string age:integer height:float

rails generate scaffold Hat type:string width:float height:float

これにより、モデル、コントローラー、...ユーザーハット、およびその移行クラスが作成されます: xxx_create_users.rb と xxx_create_hats.rb

さて、User クラスを変更したいと思います。高さ属性を削除し、Users と Hats の間の関係を追加します。

ユーザー

class User < ActiveRecord::Base
  attr_accessible :name, :age

  has_many :hats
end

帽子

class Hat < ActiveRecord::Base
  attr_accessible :type, :width, height

  belongs_to :user
end

私が推測するオプション:

  1. すべてのファイル xxx_create_xxx.rb を削除してから、以下を使用して再度作成しますrails generate migration CreateUser(Hat についても同様) 。

  2. 新しい移行ファイルを作成しrails generate migration MyNewMigrationます。すべての変更を手作業で成文化します。

クラスの変更を自動化してデータベースに渡す別の方法はありますか? 正しい進め方は?

4

3 に答える 3

3

移行の考え方は、順方向または逆方向の任意の時点から開始できる厳格なストーリーラインがあるということです。これは、移行を削除する必要がないことを意味します。

代わりに、データベース フィールドを変更、削除、または追加する新しい移行を作成します。

あなたの例では、古い移行をそのままにしてから、次のように新しい移行を作成します。

rails g migration change_user_fields

そして、あなたの中def upに書く

remove_column :table_name, :column_name
change_column :table_name, :column_name, :data_type

追加def down- これは、移行が によって取り消されるたびに実行されrake db:rollbackます。中def down入れ:

add_column :table_name, :column_name # add the field that you removed (s.a.)
change_column :table_name, :column_name, :data_type # change back to old data type

Rails 3 では、次のようにして、テーブルにフィールドを追加および削除するための便利なショートカットが提供されます。

rails g migration add_something_to_users name:string

これにより、データ型が文字列の name というフィールドを users テーブルに追加する移行が自動的に作成されます。または

rails g migration remove_something_from_users name

これにより、ユーザー テーブルから名前フィールドを削除するための移行が自動的に作成されます。これらのショートカットと作成された移行ファイルには a は必要ありませんdef down。逆にすると、レールは自動的にそれを理解するのに十分なほどスマートになります。

どちらの場合も、「何か」という言葉を好きなものに置き換えることができます。

ただし、ショートカットを使用してデータ型を変更する方法はわかっていないため、移行ファイルに移動して手動で行う必要があります。

最後に、実行するだけでrake db:migrate準備完了です。

于 2013-01-11T10:35:08.193 に答える
1

Scaffold は固定コマンドのみを自動化するため、scaffold を使用してモデルとその属性を作成すると、移行にはコマンド ラインで指定したフィールドのみが含まれます。変更を自動的に追跡する方法はありません。
データベースに何かを追加/削除/変更する場合は、手動で設定する必要があります。移行は、これらの変更を時間どおりに追跡できるため便利です。
したがって、移行を削除しないことをお勧めします。あなたが説明したこの特定のケースでは、データベースの新しい変更を反映するために別のものを作成する必要があり、別のものを削除して作成するのではなく、合計 3 つの移行を維持する必要があります。

于 2013-01-11T10:27:52.577 に答える
0

あなたの質問への答えは選択肢 2 である必要があります。ただし、属性を追加または削除するだけの場合は、すべて手作業で行う必要はありません: http://guides.rubyonrails.org/migrations.html#creating-a-スタンドアロン移行

于 2013-01-11T10:28:54.660 に答える