69

私はUserモデルとモデルを持っていTaskます。それらを作成する際に、それらの間の関係については言及していません。

私はそれを確立する必要がありUser has_many TasksTask belongs_to User移行を通じて

その関係を確立するための移行生成コマンドは何でしょうか?

4

6 に答える 6

31

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

最後に、他の回答に記載されているように、モデルに通常の関係を追加する必要がありますが、これはあなたの質問に対する正しい答えだと思います。

于 2014-09-22T19:32:05.950 に答える
18

これは、移行を通常どおり作成する方法です。

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

add_referenceを参照

has_[one | many] :childrenさらに、親モデルと子モデルを確認することを忘れないでくださいbelongs_to :parent


しない方法:

parent_idを手動で追加したくなるかもしれません。しないでください。通常、この種の操作は、移行によって、または最初のテーブル作成内で処理されます。手動で追加すると、プロジェクトの保守性が損なわれます。

関連付けに関するRuby on Rails ガイドには、この件に関する詳細情報があります。

于 2014-10-01T14:57:36.633 に答える
4

移行により、ユーザーの ID がタスク テーブルに追加されるため、ユーザーはお互いを認識できます。

rails g migration AddUserIdToTask user_id:integer

それから

rake db:migrate

そして、コントローラーとビューを更新した後、タスクを独自に作成することはできませんが、ユーザーに対応する必要があります

于 2013-11-18T07:15:58.287 に答える