2011-10-30 68 views
3

我正在使用Rail web應用程序。我有兩種模式,用戶,其中包含非常基本的信息:ID,用戶名和密碼,以及配置文件,其中包括每個用戶的配置文件。 (主要原因是要有一個輕量級的用戶模型,這個模型會定期被調用,而一個完整的配置文件將會被不規則地調用)。每個模型都有很多孩子。Rails中的兩個表具有相同的密鑰而不是has_one關係

現在,我有自己的主鍵配置文件,然後外鍵user_id與用戶匹配。

但是,我想知道是否應該使用與用戶模型相同的密鑰(即Profile.id == User.id,如果記錄引用同一用戶)具有Profile模型。這很方便,因爲當我有一個屬於User的對象時,我希望它屬於Profile,反之亦然。例如,我可以指定用戶has_many和Spec has_many與ChildModel的關係。因爲他們使用相同的密鑰,所以我不必將ChildModel合併到Spec,然後將Profile配置爲查找與子對象關聯的用戶。

不足之處在於未來,如果由於某種原因,我在用戶和規範的主鍵之間存在差異,那麼我會陷入困境。

對於這種情況,你會有什麼建議?

謝謝。

+0

在你的問題上面是配置文件和規範實際上是相同的模型?換句話說,你有四種型號 - 配置文件,用戶,規格和兒童嗎?還是隻有三種型號 - 配置文件,用戶和兒童? –

+0

是的。我糾正了我的問題中的例子。此外,Profile和User有一對一的關係。我只將它們分成兩種輕載模式。 – AdamNYC

回答

0

這聽起來像你應該使用一比一的關係在ProfileUser之間。您可以使用has_onebelongs_to聲明來創建它。

class User < ActiveRecord::Base 
    has_one :profile 
end 

class Profile < ActiveRecord::Base 
    belongs_to :user 
end 

與Rails的第四版在敏捷Web開發表示:

這裏有說明一個重要的規則:爲表包含外鍵總是belongs_to聲明模型。

+0

Rails慣例是使用模型名稱作爲單數形式,而數據庫表格是複數 – MBO

+0

@MBO:你是對的。我正在考慮它倒退。謝謝。 –

+0

嗨馬修,這就是我現在正在做的。然而,這種方法的缺點是:當我有屬於配置文件的孩子,並且我需要找出與Child對象關聯的用戶時,我需要先與Profile進行合併,然後才能進入User。它需要一個額外的合併步驟(這是昂貴的B/C這兩個表很大)。由於其他約束(例如表單等),我無法將Children類指定爲屬於User的用戶。 – AdamNYC

0

我會建議你使用HAS_ONE關係映射像下面

用戶類

class User 
    has_one :profile, :dependent => :destroy # you probably want this on destroy 
end 

遷移

create_table :users do |t| 
    t.string :username 
    t.string :password 
end 
create_table :profiles do |t| 
    t. integer :user_id 
    ... other attributes 
end 
相關問題