12

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

よろしく

4

3 に答える 3

12

モデルに属性を実際に「追加」することはできません。移行ファイルを作成して実行することで実行できます。Rails は、データベース内の列に基づいて、モデルが持つ属性を判断します。ただし、一括割り当てによって属性を更新できるようにする場合は、モデルに行を追加して属性をホワイトリストに登録する必要がありますそのため、activerecord モデルで次のような行がよく見られます。

attr_accessible :name

ただし、これはオプションであり、属性の追加に必須ではありません。

モデルに新しい属性を実際に追加するには、最初に以下を使用して移行を作成します。

rails g migration AddAddressToPerson address:string

これにより、db/migration/ ディレクトリに移行ファイルが作成されます。(「AddXXXToYYY」および「RemoveXXXFromYYY」という形式は、Rails では「モデル XXX に新しい列を追加 (または削除) する」ことを意味します。詳細については、ドキュメントを参照してください)。この場合address、文字列であるという名前の属性を追加しましたが、それを好きなように変更できます。

次に、実際にデータベースを更新するには、以下を使用して移行を実行する必要がありますrake

rake db:migrate

最後に、その属性の一括割り当てを許可する場合は、引数のリストにその属性を追加しますattr_accessible

attr_accessible :name, :address

それはそれを行う必要があります。

于 2012-10-17T23:45:04.973 に答える
2

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

変更を保持したい場合は、migrationを使用して属性をモデルに追加する必要があります。適切な構造のテキスト ファイルを作成するだけで、移行は特別なものではありませんが、このように生成する方がはるかに簡単rails generate migration AddLastNameFieldToUsersです。このようなファイルの内容は、次のように調整される場合があります。

class AddLastNameFieldToUsers< ActiveRecord::Migration
  def change
    add_column :users, :last_name, :string
  end
end
于 2012-10-17T23:43:15.803 に答える
0

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

したがって、属性を追加する必要がある場合は、他の回答で述べたように、そのフィールドを列に追加するための移行を作成する必要があります。

于 2012-10-18T04:21:17.447 に答える