我创建了User
模型,后来创建了Task
模型。创作时我没有提到它们之间的任何关系。
我理解User
has_many
Tasks
和Task
belongs_to
User
。我需要通过迁移在它们之间建立这种关系。
我的问题是,建立这种关系的迁移生成命令是什么?
任何帮助都将受到高度赞赏。
答案 0 :(得分:72)
你可以打电话:
rails g model task user:references
将在user_id
表格中生成tasks
列,并修改task.rb
模型以添加belongs_to :user
关联。请注意,您必须手动将has_many :tasks
或has_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
更新控制器和视图后,无法自行创建任务但必须与用户对应