has_many,belongs_to在活动logging移动轨道中的关系4
我创build了一个User模型,后来又创build了一个Task模型。 我在创build时没有提到它们之间的任何关系。 
 我明白, User has_many Tasks和Task belongs_to User 。 我需要通过移民来build立他们之间的关系。 
我的问题是,build立这种关系的移植生成命令是什么?
任何帮助将不胜感激。
你可以打电话给:
 rails g model task user:references 
 这将在tasks表中生成一个user_id列,并将修改task.rb模型以添加belongs_to :user task.rb 。 请注意,您必须手动将has_many :tasks或has_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 Tasks & Task 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”表。