8

Railsアプリケーションでは、モデルの変更をどのように移行できますか?たとえば、「rails g model Person name:string」というコマンドを使用してモデルを作成すると、移行も作成されることがわかります。しかし、このステップの後で、作成されたモデル "Person"に新しい属性を追加すると、この新しい属性は自動的にマイグレーションに追加され、後でデータベースに保存されますか? これを間違った方向から見て、属性を移行に追加してからモデルに追加する必要がありますか?Ruby on Rails:モデルに加えられた変更を移行する方法は?

よろしく

答えて

9

あなたは本当にモデルに属性を「追加」することはできません、あなたが移行ファイルを作成し、それを実行していることをやる - Railsの数字どの列がデータベースにあるかに基づいて、モデルが持つ属性を抽出します。しかし、を実行すると、モデルに行を追加して、属性をホワイトリストに登録する必要があります。そのため、アクティブレコードモデルでは、次のような行が頻繁に表示されます。

attr_accessible :name 

これは必須ではなく、属性を追加するために必須ではありません。デシベル/移動/ディレクトリに移行ファイルを作成します

rails g migration AddAddressToPerson address:string 

は、実際には最初での移行を作成し、モデルに新しい属性を追加します。 ( "AddXXXToYYY"と "RemoveXXXFromYYY"の形式は、レールがモデルXXXに新しい列を追加(または削除)することを意味します。詳しくはdocumentationを参照してください)。この例では、文字列であるaddressという名前の属性を追加しましたが、その属性を変更することができます。

そして、実際にデータベースを更新するために、あなたはrakeで移行を実行する必要があります。

rake db:migrate 

あなたはその属性の質量の割り当てを許可する場合は最後に、attr_accessibleに引数のリストに属性を追加:

attr_accessible :name, :address 

これでいいはずです。

+0

FYI:あなたの 'mass assignment'リンクは私に404を与えます。 – Niek

+0

ありがとう、リンクが削除されました。 –

2

あなたはattr_accessorで新しい属性を追加する場合は、移行で何もする必要はありませんが、変更内容はデータベースに保存されません。

変更を永続化する場合は、migrationを使用してモデルに属性を追加する必要があります。適切な構造を持つテキストファイルを作成するだけで、移行は素晴らしいことではありませんが、このように生成するのはずっと簡単です。rails generate migration AddLastNameFieldToUsersそのようなファイルの内容は、次のように見えるように調整されることがあります。

class AddLastNameFieldToUsers< ActiveRecord::Migration 
    def change 
    add_column :users, :last_name, :string 
    end 
end 
0

モデルに直接属性を追加する必要はありません。 Rails(実際にはActiveRecord)はそれを自動的に推論します。モデルクラスの属性のリストの場合、ARはモデル名の複数形の表を検索します(モデルがOrderの場合はorders表の属性を検索します)。これは、CoC - Configuration over Configurationと呼ばれる設計機能の一部です。

属性を追加する必要がある場合は、他の回答に記載されているように、そのフィールドを列に追加するために移行を作成する必要があります。

関連する問題