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

时间:2013-07-27 05:44:16

标签: ruby-on-rails rails-activerecord ruby-on-rails-4 rails-migrations

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

我理解User has_many TasksTask belongs_to User。我需要通过迁移在它们之间建立这种关系。

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

任何帮助都将受到高度赞赏。

6 个答案:

答案 0 :(得分:72)

你可以打电话:

rails g model task user:references

将在user_id表格中生成tasks列,并修改task.rb模型以添加belongs_to :user关联。请注意,您必须手动将has_many :taskshas_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关系不会自动创建,因此您必须为自己创建。

答案 1 :(得分:27)

回答这个问题,“用于建立该关系的迁移生成命令是什么?”(意思是,如何为具有User has_many Tasks&amp; 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

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

答案 2 :(得分:16)

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

rails g scaffold child parent:references


如果您忘记了parent:references位怎么办:

如果您没有在模型/数据库中确定有关孩子的很多内容。您最好的选择可能只是运行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 guide to association还提供了有关该主题的更多有用信息。

答案 3 :(得分:5)

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

在您的用户模型中,您将添加

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

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

看看这个guide

答案 4 :(得分:4)

Rails中的关系由模型而不是Rails来处理。

所以你只需要在你的模型中定义这种关系:

class User < ActiveRecord::Base
  has_many :tasks
end

class Task < ActiveRecord::Base
  belongs_to :user
end

只需确保迁移中存在user_id字段即可创建“任务”表。

答案 5 :(得分:4)

迁移会将用户的ID添加到任务表中,以便彼此了解

rails g migration AddUserIdToTask user_id:integer

然后

rake db:migrate

更新控制器和视图后,无法自行创建任务但必须与用户对应