我所試圖做的是一種像這樣:創建在軌多重關係具有相同的數據類型
我有數據類型「用戶」和「文章」的實例。我想要在這兩者之間建立聯繫,但方式不止一種。
因此,例如,我想讓用戶「喜歡」或「書籤」一篇文章。所以我需要在數據庫中有兩個關係,一個是喜歡這篇文章的用戶,另一個是關於用戶書籤的關係,所以例如創建一個「user_article」表將不夠用,正確嗎?
這樣做的最好方法是什麼?
我所試圖做的是一種像這樣:創建在軌多重關係具有相同的數據類型
我有數據類型「用戶」和「文章」的實例。我想要在這兩者之間建立聯繫,但方式不止一種。
因此,例如,我想讓用戶「喜歡」或「書籤」一篇文章。所以我需要在數據庫中有兩個關係,一個是喜歡這篇文章的用戶,另一個是關於用戶書籤的關係,所以例如創建一個「user_article」表將不夠用,正確嗎?
這樣做的最好方法是什麼?
你所描述的是「數據模型」而不是「數據類型」。數據類型=字符串,整數等。如果它是一個活動記錄對象,它更具體地是一個數據模型或一個活動記錄模型。
Eimantas指出你描述的是2個「has_many」關係,但不是寫在他的文章中的「have_many」。在他的例子中,書籤被稱爲連接模型。記住你可以在連接模型中放置其他東西,並使用它們之間的關係來完成任務。假設你想要一個書籤順序或者一個最喜歡的排名 - 這個連接模型就是這個主意。
精簡例如:
class Article < ActiveRecord::Base
has_many :users, :through => :user_bookmarks
end
class UserBookmark < ActiveRecord::Base
belongs_to :user
belongs_to :article
end
class User < ActiveRecord::Base
has_many :user_bookmarks
has_many :articles, :through => :user_bookmarks
end
事情看得到了基礎知識後: 計數器緩存 - 如果你正在做計數他們是你的朋友。
僅僅使用這兩個連接模型可能會更容易和更乾淨,而不是試圖潛入多態現在。在啓動並運行後,您可以繼續探索。
我建議Bookmarking
模型有bookmarking_type
(注意type
是保留給RoR)。那麼你可以has_many :bookmarkings
和has_many :liked_articles, :through => :bookmarkings
和has_many :bookmarks, :through => :bookmarkings
。當然,你應該添加條件或者只是將SQL加入到這些關聯中,但都應該是好的。我相信甚至有插件,只是不記得atm的名字。
好吧,所以我創建一個新的數據類型只用於關係?我會給它一個鏡頭! – Lowgain 2010-03-29 20:04:07
這是「has_many」而不是「have_many」 – Nick 2010-03-30 16:14:46
謝謝,尼克,固定!雖然我確實試着用句子流。) – Eimantas 2010-03-31 07:01:02