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”表。