Rails非常规数据库结构,这对于关联有问题吗?

时间:2016-05-15 23:00:12

标签: ruby-on-rails ruby rails-migrations

我公司的老团队负责人对Ruby on Rails知之甚少,并为协会的db结构使用了奇怪的约定。

假设我有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,我希望可以帮助我保存信息。

1 个答案:

答案 0 :(得分:2)

这只是一种冗长的方式来编写Rails将按惯例自动执行的操作。

User.role关系中,这个:

belongs_to :role, :class_name => 'Role', :foreign_key => :role_id

相当于:

belongs_to :role

Rails可以根据关系的名称推断出class_name和foreign_key。在这种情况下,它只是一种不会受到伤害的冗余。

foreign_key实际上是用于存储关系id值的字段的名称,它根本不是数据库外键。

您可以通过创建要更新的迁移或每个表来为这些关系添加数据库外键。 Adding foreign key to a rails model中有一个很好的答案,可以逐步说明这一点。