2017-01-16 130 views
1

我有一個使用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

回答

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只會進入用戶。在一對一的關係中(你的例子),你只需創建一個表格,並在表格中包含你需要的所有列。

相關問題