我有一个使用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惯例,但我无法看到它有什么缺点。有没有什么我以后没有看到可能会在我身上爆炸?
答案 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
只会进入用户。在一对一的关系中(您的示例是),您只需创建一个包含该表中所需列的表。