我公司的老团队负责人对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,我希望可以帮助我保存信息。
答案 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中有一个很好的答案,可以逐步说明这一点。