2011-07-09 118 views
0

假設我正在構建一個擁有許多博客和許多用戶的引擎。用戶可以有很多博客和博客可以有很多用戶(用戶擁有和擁有許多博客)。我想創建一個數據透視表名爲users_blogs這將是這樣的:將透視表加入到另一個表(HABTM加入HABTM和模型關聯)

id user_id blog_id role 

1 1  1  admin 
2 1  2  poster 
3 2  2  admin 

因此,用戶1屬於博客1和2,和用戶2屬於博客2.用戶1是博客1管理員,並博客2中的海報,用戶2是博客2中的管理員。

還會有帖子。 users_blog會有很多帖子,帖子可以有很多users_blog。

id users_blog_id post_id 
1 2    1 
2 3    1 

是這樣,參照users_blogs,對博客用戶2 1 2用戶對協作博客2創建後1

我:他們將與樞軸表看起來像這樣被連接對於MVC來說相對來說比較新,所以我想知道A)第一個表中的「角色」數據是否應該是它的位置?B)是否有更正確的方法來實現這種結構?框架將爲我做出魔術,我只是想確保這是有道理的,並且我已經有了正確的命名約定。我使用CakePHP,但我也認爲這個問題可以由Rails程序員解答。

謝謝!

回答

2

它看起來像你在正確的軌道上。如果我理解你,這是應該如何:

我沒有完全理解你的一個陳述,所以我假設一個postbelongsTo單個blog最喜歡。

第一個問題是,您的「數據透視表」命名約定必須按字母順序 - 所以它應該是blogs_users而不是users_blogs。似乎很小,但不會工作。

協會:

blog hasMany post 
post belongsTo blog 

user hasAndBelongsToMany blog //allowing more than one user to be associated to a blog 
blog hasAndBelongsToMany user 

user hasAndBelongsToMany post //allowing more than one user to be associated to a post 
post hasAndBelongsToMany user 

role hasAndBelongsToMany user //better to keep roles in a table that just a string 
user hasAndBelongsToMany role //use 'with'=>'blogs_users' in your association 
           between user/roll 

表:

users   (id, name, ...etc) 
blogs   (id, title, ...etc) 
roles   (id, role) 
blogs_users  (id, user_id, role_id, blog_id) 
posts   (id, title, blog_id) 
posts_users  (id, post_id, user_id) 

更新:

我不是最好的,在這一點 - 還是有點學習自己,但 - 關閉我的頭頂,你可以得到帖子從用戶1通過像這樣創建博客1:

$blogId = '1'; 
$userId = '1'; 
$posts = $this->Post->find('all', array(
    'conditions' => array(
     'User.id' => $userId, 
     'Blog.id' => $blogId 
    ) 
); 
+0

你是對的字母順序的東西,你回答我的第一個問題,「角色」應該駐留在數據透視表中。 說用戶1有100個博客。如果我們想從博客#1獲取用戶1的帖子,我們必須抓取所有posts_users,然後抓取所有帖子,然後匹配blog_id和user_id。 相反,如果我們有blogs_users_posts表,該怎麼辦。我們將從代表用戶1和博客#1的blogs_users(blog_user_id)中抓取一條記錄,並使用該blog_user_id查找blogs_users_posts中的所有帖子。這樣做似乎比上面的方式更快。這是正確的嗎? 謝謝! – MattDiamant

+0

如果您想從博客#1中獲取用戶1的帖子,我們假設您已經擁有博客ID和user_id - 所以 - 只需從該特定博客中提取任何帖子(帖子表中有一個blog_id),然後設置您的條件只需要user_id = 1的帖子。也許我錯過了一些東西? – Dave

+0

我想我意識到我的問題在哪裏。我認爲將blog_id添加到users_posts表中會有一些價值。如果我有一個表中的user_id和blog_id,我可以在該博客中找到該用戶的所有post_id,而不必離開該表。這隻會對計算博客中的用戶帖子,也許還有其他的事情有用嗎?如果我在一個表中同時擁有user_id和blog_id,爲什麼不將它們組合成users_blog_id並引用users_blog。這會使表格的尺寸與users_posts相同,並提供更多信息。我認爲它也會節省查詢時間,但事實並非如此。 – MattDiamant

0

這不是一個真正的rails,cakephp或mvc問題,但是您的關係數據庫模式看起來應該基於您所描述的內容。

+0

當命名約定正確時,Cake和Ruby會做很多「automagic」的東西。我也在問,這種做這種關聯的方式是否是最佳做法,還是有更好的方法來做到這一點。 – MattDiamant

0

我不知道CakePHP的,但也有關於你的三個問題連接表,這將打破Rails中的habtm關係。

1)默認情況下,連接表名爲blogs_users。 2)連接表不能有任何其他屬性,如role。 3)連接表不能有id

所以你的blogs_users表應該只有blog_iduser_id,否則你會得到錯誤。

如果你想讓你的連接表在Rails中成爲一個完整的模型,你需要使用has_many :through關係。所以

class User 
    has_many :user_blogs 
    has_many :blogs, :through => :user_blogs 
end 

class UserBlog 
    belongs_to :blog 
    belongs_to :user 

    validates_presence_of :role, :in => ALLOWED_ROLE_NAMES # Example of logic in this model 
end 

class Blog 
    has_many :user_blogs 
    has_many :users, :through => :user_blogs 
end 
+0

他提到他使用CakePHP,因此,#2)是不正確的,#3)也是不正確的 – Dave

+0

我聽說Cakephp非常類似於Rails。如果Rails不允許你這樣做,而CakePHP確實如此,那麼這個問題就不適合Rails的答案。對於那個很抱歉。 – MattDiamant