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 中有一个很好的答案,给出了一步一步的说明。