2012-08-30 70 views
2

假設我們正在製作博客。通常情況下,模型是這樣的:在Rails中,如何通過多列將模型引用到另一個模型?

class User 
    has_many :posts 
end 

class Post 
    belongs_to :user 
end 

而且他們的模式是這樣的:

User 
    id 

Post 
    id 
    user_id 

但現在,用戶可以通過Facebook/Twitter的/等登錄,我們希望有一個職位屬於不到用戶對象,而是提供者的提供者id的組合。

新的模式將類似於:

User 
    id 
    provider 
    uid 

Post 
    id 
    user_provider 
    user_uid 

而且我不知道該車型會是什麼樣子:

class User 
    has_many :posts, :foreign_key => ['user_provider', 'user_uid'] # Is this right?? 
end 

class Post 
    belongs_to :user, :class_name => User # Again, this is a guess... 
end 

我在正確的軌道上? Rails的做法是什麼?

回答

1

開箱即用的導軌中不能有複合主鍵。福特,我認爲你將不得不使用寶石。我會建議你找到一個解決方法。

但是有一個起點,請看這裏:

http://compositekeys.rubyforge.org/

0

你能否解釋一下,爲什麼你要這麼做?

標準的Rails實踐中,主鍵是一個名爲「id」的整數,因此外鍵就是這樣。

但是,沒有什麼能夠阻止您創建複合索引並確保化合物唯一性。

在Post模型,你可以寫:

validate_uniqueness_of :uid, :scope => :provider 

或使用較新的Rails 3的語法:

validates :uid, :uniqueness => {:scope => :provider} 

您可以添加複合索引到你的遷移:

add_index :posts, [:uid, :provider] 

或使用唯一索引在數據庫級執行唯一性:

add_index :posts, [:uid, :provider], :unique => true 
相關問題