has_many,belongs_to在活动logging移动轨道中的关系4

我创build了一个User模型,后来又创build了一个Task模型。 我在创build时没有提到它们之间的任何关系。

我明白, User has_many TasksTask belongs_to User 。 我需要通过移民来build立他们之间的关系。

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

任何帮助将不胜感激。

你可以打电话给:

 rails g model task user:references 

这将在tasks表中生成一个user_id列,并将修改task.rb模型以添加belongs_to :user task.rb 。 请注意,您必须手动将has_many :taskshas_one :task关系放到user.rb模型中。

如果您已经生成了模型,则可以使用以下命令创build迁移:

 rails g migration AddUserToTask user:belongs_to 

这将产生:

 class AddUserToTask < ActiveRecord::Migration def change add_reference :tasks, :user, index: true end end 

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

为了回答这个问题,“build立关系的迁移生成命令是什么?”(意思是,如何为现有模型添加迁移,例如User has_many TasksTask belongs_to User

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

 >rails g migration AddUserToTask user:belongs_to 

要么

 >rails g migration AddUserToTask user:references 

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

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

 class AddUserToTask < ActiveRecord::Migration def change add_reference :tasks, :user, index: true end end 

产生后,你:

 >rake db:migrate 

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

在创build迁移时应该如何做:

rails g scaffold child parent:references


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

如果你真的没有在模型/ db中定义很多关于孩子的东西。 你最好的办法可能就是运行rails destroy scaffold child ,然后运行rails g scaffold child parent:references它。 一定要添加行drop_table :children if table_exists? :children drop_table :children if table_exists? :children在创build新表的文件中创build表之前的子项。 (这样,如果有人拉你的代码,他们可以运行迁移并完成。)但是,你可能已经有了不想在子模型中丢失的数据。


在这种情况下:

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 has_[one | many] :children ,而且孩子模型belongs_to :parent


怎么不这样做:

你可能会试图手动添加parent_id,你当然可以,这不是最好的解决scheme,因为它不是传统的添加外键的方式,并且不能很好地维护或可读性。 公约超过configuration!

Ruby on 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 

并且在更新你的控制器和视图之后,这样任务不能自己创build,但必须对应于一个用户

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

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

 class User < ActiveRecord::Base has_many :tasks end class Task < ActiveRecord::Base belongs_to :user end 

只要确保在迁移中存在user_id字段以创build“tasks”表。