has_many,belongs_to关系在活动记录迁移rails 4中

Has*_*bal 59 ruby-on-rails rails-migrations ruby-on-rails-4 rails-activerecord

我创建了一个User模型,后来创建了一个Task模型.创作时我没有提到它们之间的任何关系.

我理解User has_many Tasks和a Task belongs_to User.我需要通过迁移在它们之间建立这种关系.

我的问题是,建立这种关系的迁移生成命令是什么?

任何帮助将受到高度赞赏.

Alt*_*gos 75

你可以打电话:

rails g model task user:references
Run Code Online (Sandbox Code Playgroud)

这将user_idtasks表中生成一列,并将修改task.rb模型以添加关系belongs_to :user.请注意,您必须手动设置has_many :taskshas_one :taskuser.rb模型的关系.

如果已生成模型,则可以使用以下内容创建迁移:

rails g migration AddUserToTask user:belongs_to
Run Code Online (Sandbox Code Playgroud)

这会产生:

class AddUserToTask < ActiveRecord::Migration
  def change
    add_reference :tasks, :user, index: true
  end
end
Run Code Online (Sandbox Code Playgroud)

与此方法的唯一区别是,模型中的belongs_to :user关系task.rb不会自动创建,因此您必须为自己创建它.

  • 值得注意的是:belongs_to是别名:引用,我想.但是答案很好.:) (6认同)

cha*_*ad_ 28

要回答这个问题,"用于建立该关系的迁移生成命令是什么?"(意思是,如何为具有User has_many Tasks&的关系的现有模型添加迁移Task belongs_to User)

我记住的最简单的方法是这样的:

>rails g migration AddUserToTask user:belongs_to
Run Code Online (Sandbox Code Playgroud)

要么

>rails g migration AddUserToTask user:references
Run Code Online (Sandbox Code Playgroud)

:belongs_to只是别名:references,所以要么做同样的事情.

这样做,该命令将从迁移名称推断表的名称,设置一个更改方法,该方法将添加关系列,并将其配置为索引:

class AddUserToTask < ActiveRecord::Migration
  def change
    add_reference :tasks, :user, index: true
  end
end
Run Code Online (Sandbox Code Playgroud)

生成后你:

>rake db:migrate
Run Code Online (Sandbox Code Playgroud)

最后,您还需要在模型中添加常用关系,如其他答案中所述,但我认为这是您问题的正确答案.


011*_*112 16

首先在创建迁移时应该如何完成:

rails g scaffold child parent:references


如果你忘了这parent:references一点该怎么办:

如果你没有真正在模型/ db中定义关于孩子的很多东西.你最好的选择可能只是运行rails destroy scaffold child,然后运行 rails g scaffold child parent:references它.确保drop_table :children if table_exists? :children在创建新表的文件中的create table之前添加该行.(这样,如果有人提取你的代码,他们就可以运行迁移并完成.)但是,你似乎更有可能拥有你不想在子模型中丢失的数据.


在这种情况下:

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
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅add_reference.

另外不要忘记确保父模型has_[one | many] :children,以及子模型belongs_to :parent.


怎么不这样做:

您可能只是想进入并手动添加parent_id,您当然可以,这不是最佳解决方案,因为它不是添加外键的传统方式,并且不适合可维护性或可读性.约定超过配置!

Ruby on Rails的引导协会也有关于这个问题的更多有用的信息.


Alt*_*eez 5

没有可以使用的特殊迁移命令.

在您的用户模型中,您将放置

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

在相应的任务迁移文件中,您将以下字段添加了user_id

看一下本指南

  • 这很好,但是,如果表用户在任务表创建中不包含`t.references:user`,则此^将不起作用. (3认同)