Rails:我可以在一对一的关系中使用外键作为主键吗?

时间:2017-01-16 17:02:00

标签: ruby-on-rails activerecord

我有一个使用Devise的User模型,我正在为它创建一个Profile模型。

class User < ApplicationRecord
  has_one :profile
end

class Profile < ApplicationRecord
  belongs_to :user
end

由于每个用户只有一个配置文件,我认为通过使用current_user.id访问配置文件中的数据可以大大简化操作。因此,我正在考虑跳过普通主键列的创建,并将我的“个人档案”表中的外键设置为我的主键。

这是我正在使用的迁移:

class CreateProfiles < ActiveRecord::Migration[5.0]
  def change
    create_table :profiles, {id: false} do |t|
      t.references :user, foreign_key: true, primary_key: true
    end
  end
end

我发现an old thread elsewhere表明这违反了Rails惯例,但我无法看到它有什么缺点。有没有什么我以后没有看到可能会在我身上爆炸?

1 个答案:

答案 0 :(得分:0)

外键的关键是将主键引用到另一个表。由于没有主键,它只是表上的另一列,无法引用上一个表中的列。

即:

Table 1: Users

user_id      name    password  post_id
    1        john    pass         1


Table 2: Posts

post_id    post_content
  1        "hello world"

如果您在表2中省略了写post_id,则无法在表1中引用它。简单地说,您必须在表上有一个主键才能被另一个引用表作为外键。

但是,如果您真的想避免使用不必要的列(主键),则可以将表“连接”(组合)在一起,而不需要使用第二个主键。在上面的示例中,post_content只会进入用户。在一对一的关系中(您的示例是),您只需创建一个包含该表中所需列的表。