Has*_*bal 59 ruby-on-rails rails-migrations ruby-on-rails-4 rails-activerecord
我创建了一个User模型,后来创建了一个Task模型.创作时我没有提到它们之间的任何关系.
我理解User has_many Tasks和a Task belongs_to User.我需要通过迁移在它们之间建立这种关系.
我的问题是,建立这种关系的迁移生成命令是什么?
任何帮助将受到高度赞赏.
Alt*_*gos 75
你可以打电话:
rails g model task user:references
Run Code Online (Sandbox Code Playgroud)
这将user_id在tasks表中生成一列,并将修改task.rb模型以添加关系belongs_to :user.请注意,您必须手动设置has_many :tasks或 has_one :task与user.rb模型的关系.
如果已生成模型,则可以使用以下内容创建迁移:
rails g migration AddUserToTask user:belongs_to
Run Code Online (Sandbox Code Playgroud)
这会产生:
class AddUserToTask < ActiveRecord::Migration
def change
add_reference :tasks, :user, index: true
end
end
Run Code Online (Sandbox Code Playgroud)
与此方法的唯一区别是,模型中的belongs_to :user关系task.rb不会自动创建,因此您必须为自己创建它.
cha*_*ad_ 28
要回答这个问题,"用于建立该关系的迁移生成命令是什么?"(意思是,如何为具有User has_many Tasks&的关系的现有模型添加迁移Task belongs_to User)
我记住的最简单的方法是这样的:
>rails g migration AddUserToTask user:belongs_to
Run Code Online (Sandbox Code Playgroud)
要么
>rails g migration AddUserToTask user:references
Run Code Online (Sandbox Code Playgroud)
:belongs_to只是别名:references,所以要么做同样的事情.
这样做,该命令将从迁移名称推断表的名称,设置一个更改方法,该方法将添加关系列,并将其配置为索引:
class AddUserToTask < ActiveRecord::Migration
def change
add_reference :tasks, :user, index: true
end
end
Run Code Online (Sandbox Code Playgroud)
生成后你:
>rake db:migrate
Run Code Online (Sandbox Code Playgroud)
最后,您还需要在模型中添加常用关系,如其他答案中所述,但我认为这是您问题的正确答案.
011*_*112 16
rails g scaffold child parent:references
如果你忘了这parent:references一点该怎么办:
如果你没有真正在模型/ db中定义关于孩子的很多东西.你最好的选择可能只是运行rails destroy scaffold child,然后运行
rails g scaffold child parent:references它.确保drop_table :children if table_exists? :children在创建新表的文件中的create table之前添加该行.(这样,如果有人提取你的代码,他们就可以运行迁移并完成.)但是,你似乎更有可能拥有你不想在子模型中丢失的数据.
在这种情况下:
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
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅add_reference.
另外不要忘记确保父模型has_[one | many] :children,以及子模型belongs_to :parent.
怎么不这样做:
您可能只是想进入并手动添加parent_id,您当然可以,这不是最佳解决方案,因为它不是添加外键的传统方式,并且不适合可维护性或可读性.约定超过配置!
在Ruby on Rails的引导协会也有关于这个问题的更多有用的信息.
没有可以使用的特殊迁移命令.
在您的用户模型中,您将放置
class User < ActiveRecord::Base
has_many :tasks
end
class Task < ActiveRecord::Base
belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)
在相应的任务迁移文件中,您将以下字段添加了user_id
看一下本指南
| 归档时间: |
|
| 查看次数: |
56083 次 |
| 最近记录: |