Rails 非常规的数据库结构,这对关联有问题吗?
Rails Unconventional DB Structure, is this problematic for associations?
我公司的老团队负责人对 Ruby 关于 Rails 的了解很少,并且对关联的数据库结构使用了奇怪的约定。
假设我有一个 User
模型和一个 Role
模型,并且用户属于一个角色。
我认为典型的:
rails g migration AddRoleToUsers role:references
# app/models/user.rb
belongs_to :role
# app/models/role.rb
has_many :users
但我可以清楚地看到发生了其他事情。
每当我 User.new
,我都会得到类似的东西:
#<User stuffs, role_id: nil>
在我得到的模型中
# app/models/user.rb
belongs_to :role, :class_name => 'Role', :foreign_key => :role_id
# app/models/role.rb
has_many :users
这种模式在我们的应用程序中占据了很大一部分。我可以看出这些列是索引,但实际上没有外键。
第一个问题,这个有问题吗?对我来说,这意味着参照完整性问题。
第二个问题,如何在事后添加外键并保留现有数据?
我正在使用一个叫做数据迁移的gem,我希望它能帮助我保存信息。
这只是写 Rails 按照约定自动执行的内容的冗长方式。
在User.role
关系中,这个:
belongs_to :role, :class_name => 'Role', :foreign_key => :role_id
相当于:
belongs_to :role
Rails可以根据关系的名称推断出class_name和foreign_key。这只是一种冗余,在这种情况下不会造成伤害。
foreign_key
实际上是用于存储关系的 id
值的字段名称,它根本不是数据库外键。
您可以通过创建迁移或每个要更新的 table 来为这些关系添加数据库外键。在 Adding foreign key to a rails model 中有一个很好的答案,给出了一步一步的说明。
我公司的老团队负责人对 Ruby 关于 Rails 的了解很少,并且对关联的数据库结构使用了奇怪的约定。
假设我有一个 User
模型和一个 Role
模型,并且用户属于一个角色。
我认为典型的:
rails g migration AddRoleToUsers role:references
# app/models/user.rb
belongs_to :role
# app/models/role.rb
has_many :users
但我可以清楚地看到发生了其他事情。
每当我 User.new
,我都会得到类似的东西:
#<User stuffs, role_id: nil>
在我得到的模型中
# app/models/user.rb
belongs_to :role, :class_name => 'Role', :foreign_key => :role_id
# app/models/role.rb
has_many :users
这种模式在我们的应用程序中占据了很大一部分。我可以看出这些列是索引,但实际上没有外键。
第一个问题,这个有问题吗?对我来说,这意味着参照完整性问题。
第二个问题,如何在事后添加外键并保留现有数据?
我正在使用一个叫做数据迁移的gem,我希望它能帮助我保存信息。
这只是写 Rails 按照约定自动执行的内容的冗长方式。
在User.role
关系中,这个:
belongs_to :role, :class_name => 'Role', :foreign_key => :role_id
相当于:
belongs_to :role
Rails可以根据关系的名称推断出class_name和foreign_key。这只是一种冗余,在这种情况下不会造成伤害。
foreign_key
实际上是用于存储关系的 id
值的字段名称,它根本不是数据库外键。
您可以通过创建迁移或每个要更新的 table 来为这些关系添加数据库外键。在 Adding foreign key to a rails model 中有一个很好的答案,给出了一步一步的说明。