私はUser
モデルとモデルを持っていTask
ます。それらを作成する際に、それらの間の関係については言及していません。
私はそれを確立する必要がありUser
has_many
Tasks
、Task
belongs_to
User
移行を通じて
その関係を確立するための移行生成コマンドは何でしょうか?
私はUser
モデルとモデルを持っていTask
ます。それらを作成する際に、それらの間の関係については言及していません。
私はそれを確立する必要がありUser
has_many
Tasks
、Task
belongs_to
User
移行を通じて
その関係を確立するための移行生成コマンドは何でしょうか?
User has_many Tasks
「その関係を確立するためのマイグレーション生成コマンドは何ですか?」という質問に答えるために (つまり、 &のような関係を持つ既存のモデルのマイグレーションをどのように追加しますか? Task belongs_to User
)
私が覚える最も簡単な方法は次のとおりです。
>rails g migration AddUserToTask user:belongs_to
また
>rails g migration AddUserToTask user:references
:belongs_to
は単に のエイリアスで:references
あるため、どちらでも同じことを行います。
このようにすると、コマンドは移行名からテーブルの名前を推測し、関係の列を追加する変更メソッドを設定し、インデックスを作成するように構成します。
class AddUserToTask < ActiveRecord::Migration
def change
add_reference :tasks, :user, index: true
end
end
それを生成した後:
>rake db:migrate
最後に、他の回答に記載されているように、モデルに通常の関係を追加する必要がありますが、これはあなたの質問に対する正しい答えだと思います。
これは、移行を通常どおり作成する方法です。
rails g scaffold child parent:references
テーブルを作成したときに追加するのを忘れましparent:references
た。どうすればよいですか?
オプション 1: テーブルを破棄して最初からやり直す
子テーブルについて、model/db に多く定義されていない場合。あなたの最善の策は、 を実行してrails destroy scaffold child
から、それを実行
rails g scaffold child parent:references
することです。drop_table :children if table_exists? :children
新しいテーブルを作成するファイルの create table の前に、必ず行を追加してください。(そうすれば、誰かがあなたのコードを引っ張ってきても、移行を実行するだけで完了することができます。) ただし、子モデルで失いたくないデータが既に存在する可能性が高くなります。その場合:
オプション 2: 移行を記述して参照を追加する
rails g migration add_parent_refs_to_child
## XXXXXXXXXXXXXX_add_parent_refs_to_child.rb
class AddParentRefsToChild < ActiveRecord::Migration
def change
add_reference :child, :parent, index: true
end
end
has_[one | many] :children
さらに、親モデルと子モデルを確認することを忘れないでくださいbelongs_to :parent
。
しない方法:
parent_id
を手動で追加したくなるかもしれません。しないでください。通常、この種の操作は、移行によって、または最初のテーブル作成内で処理されます。手動で追加すると、プロジェクトの保守性が損なわれます。
関連付けに関するRuby on Rails ガイドには、この件に関する詳細情報があります。
移行により、ユーザーの ID がタスク テーブルに追加されるため、ユーザーはお互いを認識できます。
rails g migration AddUserIdToTask user_id:integer
それから
rake db:migrate
そして、コントローラーとビューを更新した後、タスクを独自に作成することはできませんが、ユーザーに対応する必要があります