web-dev-qa-db-ja.com

has_many、アクティブなレコード移行のbelongs_to関係Rails 4

Userモデルを作成し、後でTaskモデルを作成しました。作成中にそれらの関係については言及していません。

Userhas_manyTasksおよびTaskbelongs_toUser。移行を通じて、これらの関係を確立する必要があります。

私の質問は、その関係を確立するための移行生成コマンドは何ですか?

どんな助けも大歓迎です。

59
Hasan Iqbal

あなたは電話することができます:

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関係が自動的に作成されないため、独自に作成する必要があることです。

73
Alter Lagos

「その関係を確立するための移行生成コマンドはどうなりますか?」という質問に答えるために(つまり、User has_many TasksTask 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

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

27
chad_

そもそも移行を作成するときの方法:

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関連付けガイド も、このテーマに関する有用な情報を提供しています。

16
0112

使用される特別な移行コマンドはありません。

あなたのユーザーモデルにあなたが置きます

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

タスクに対応する移行ファイルには、user_idが追加された次のフィールドがあります

これを見てください ガイド

5
Althaf Hameez

Railsの関係は、Railsではなくモデルによって処理されます。

したがって、モデルでこの関係を定義するだけです。

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

そして、user_idフィールドは、「タスク」テーブルを作成するための移行に存在します。

4
Amitkumar Jha

移行により、ユーザーのIDがタスクテーブルに追加され、相互に認識されるようになります。

Rails g migration AddUserIdToTask user_id:integer

それから

rake db:migrate

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

4
Connor Leech