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

问题描述:

我有一个使用Devise的用户模型,我正在为它创建一个Profile模型。Rails:我可以使用外键作为一对一关系中的主键吗?

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约定,但我看不出有什么缺点了这一点。有什么我没有看到的,将来可能会炸毁我吗?

+0

为什么你想这样做,跳过正常主键的创建是否有任何好处? – Iceman

+0

由于这是一对一的关系,因此我认为能够使用'current_user.id'中的值访问User和Profile并将Profile数据保存在单独的模型中会更容易。 – Valentine

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

即:

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只会进入用户。在一对一的关系中(你的例子),你只需创建一个表格,并在表格中包含你需要的所有列。