User
モデルを作成し、後でTask
モデルを作成しました。作成中にそれらの関係については言及していません。
User
has_many
Tasks
およびTask
belongs_to
User
。移行を通じて、これらの関係を確立する必要があります。
私の質問は、その関係を確立するための移行生成コマンドは何ですか?
どんな助けも大歓迎です。
あなたは電話することができます:
Rails g model task user:references
tasks
テーブルにuser_id
列を生成し、task.rb
モデルを変更してbelongs_to :user
関係を追加します。 has_many :tasks
またはhas_one :task
関係をuser.rb
モデルに手動で配置する必要があることに注意してください。
既にモデルを生成している場合、次を使用して移行を作成できます。
Rails g migration AddUserToTask user:belongs_to
生成されるもの:
class AddUserToTask < ActiveRecord::Migration
def change
add_reference :tasks, :user, index: true
end
end
このアプローチとの唯一の違いは、belongs_to :user
モデルのtask.rb
関係が自動的に作成されないため、独自に作成する必要があることです。
「その関係を確立するための移行生成コマンドはどうなりますか?」という質問に答えるために(つまり、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
ビットを忘れた場合の対処:
子についてmodel/dbで実際にたくさん定義されていない場合。最善の方法は、Rails destroy scaffold child
を実行してから、Rails g scaffold child parent:references
を実行することです。新しいテーブルを作成するファイルにテーブルを作成する前に、必ずdrop_table :children if table_exists? :children
行を追加してください。 (そうすれば、だれかがあなたのコードを引っ張った場合、彼らはただマイグレーションを実行して終了することができます。)ただし、子モデルで失いたくないデータをすでに持っている可能性が高いようです。
その場合:
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
詳細については add_reference をご覧ください。
また、親モデルがhas_[one | many] :children
であり、子モデルがbelongs_to :parent
であることを忘れないでください。
それをしない方法:
Parent_idを手動で追加するだけで、外部キーを追加する従来の方法ではなく、保守性や可読性にあまり向いていないため、これは最善の解決策ではありません。 。設定より規約!
Ruby on Rails関連付けガイド も、このテーマに関する有用な情報を提供しています。
使用される特別な移行コマンドはありません。
あなたのユーザーモデルにあなたが置きます
class User < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :user
end
タスクに対応する移行ファイルには、user_idが追加された次のフィールドがあります
これを見てください ガイド
Railsの関係は、Railsではなくモデルによって処理されます。
したがって、モデルでこの関係を定義するだけです。
class User < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :user
end
そして、user_id
フィールドは、「タスク」テーブルを作成するための移行に存在します。
移行により、ユーザーのIDがタスクテーブルに追加され、相互に認識されるようになります。
Rails g migration AddUserIdToTask user_id:integer
それから
rake db:migrate
また、コントローラーとビューを更新した後、タスクを独自に作成することはできませんが、ユーザーに対応する必要があります