2013-04-08 30 views
2

我注意到我可能創建的關係問題。什麼是用Mongoid建模的理想方式?多個模型的問題

我開始使用照片模型。管理員可以上傳照片,並且他們會在網站上存在。

在以後的迭代中,相冊被添加到代碼庫中,以便可以在自己的頁面上組織照片的集合。

Album 
    has_many :photos, inverse_of: :album 
Photo 
    belongs_to :album, inverse_of: :photo 

玩完上面我注意到,照片可以永遠只屬於一個相冊。那一直沒問題。

現在出現了一個新問題。我想添加也是他們自己的模型的工作人員的照片。

我也有一些特殊的邏輯在我的照片模型來處理使用特定的上傳服務(filepicker)。

Staff 
    field :name, type: String 

我該如何做到讓員工可以擁有自己的照片?我應該創建一個用於反規範化的新模型StaffPhoto嗎?我正在考慮將照片嵌入或者屬於職員,但是我不確定屬於專輯和職員是否有意義。現在唯一對我最有意義的是創建一個單獨的模型,並將上傳服務邏輯抽象爲一個模塊並將其包含到兩者中。但是我可能是錯的。最重要的部分是,照片的整體將存在於他們自己的作品中,或者作爲專輯的一部分,或者是作品的一部分(不止一張照片)。

關於如何建模的建議?

回答

1

多態關聯性好,當你有屬於不同的所有者的東西班;例如當你有可能來自電影或電視節目的照片,並且你的電影和電視節目已經在你的數據庫中建模時 - 那麼你將使用多態關聯來引用一個「擁有」對象照片。

通常情況下,您不想使用不同的型號爲管理員,員工和用戶建模。 更簡單的方法是將它們全部建模爲用戶,然後分別建模角色和權限,例如,每個人都可能成爲管理員。

如果您選擇了這種用戶建模,那麼您在照片模型中需要的只是一個user_id來模擬所有者是誰 - 而且您不在乎這是管理員還是工作人員還是普通用戶。

如果您還想模擬照片的使用方式,例如管理員照片與員工照片完全不同(例如,管理員照片是背景,員工照片是頭像),那麼您可能還需要爲照片指定「照片類型」屬性。

我不認爲在你的情況下多態關聯是最好的解決方案。

請查看關於角色/授權的Railscast,以便您可以在一個模型中對管理員/員工進行建模。

http://railscasts.com/episodes?search=authorization


關於嵌入式文件:

有使用嵌入文檔的幾個方面的考慮:

  • 沒有嵌入文檔擴充/充實父文檔?
  • 不超過16MB的MongoDB記錄大小
  • ,如果你需要在所有的嵌入文檔

在照片的情況下進行搜索,你會要嵌入引用您的照片,而不是照片本身,因爲照片可以有大尺寸。

如果您的應用程序中有多少張照片供用戶使用?隨着時間的推移,他們的人數會不斷增加?如果是,那麼你可能不想嵌入它們。

照片是否增加了用戶記錄?例如這是一個頭像照片嗎?如果沒有,那麼你可能不想嵌入它。

您是否曾經需要搜索照片?可能不會。其他類型的嵌入式文檔可能需要從頂層搜索,然後您無法嵌入它們。

+0

然後,一個嵌入式文件會更有意義多態關聯?嵌入式似乎在你所說的共享方式中更有意義。 – 2013-04-15 04:35:14

+0

可能不是,但請參閱上述我的回答的修正 – Tilo 2013-04-15 17:39:55

+0

謝謝。照片文件目前並不是很大。照片本身存儲在s3上,所以照片文檔只有照片本身的文件路徑屬性,所以我不認爲這個尺寸可能會變得太大。我最初認爲照片必須自己存在,但現在看起來它更像是其他模型所具有的功能,這使得我對是否使它嵌入或多態化感到困惑。 – 2013-04-16 00:14:13

1

你所尋找的導向是完全描述: http://guides.rubyonrails.org/association_basics.html#polymorphic-associations

您可以創建一個多態關聯:

class Photo < ActiveRecord::Base 
    belongs_to :photoable, :polymorphic => true 
end 

class Album < ActiveRecord::Base 
    has_many :photos, :as => :photoable 
end 

class Staff < ActiveRecord::Base 
    has_many :photos, :as => :photoable 
end 
+0

如果我這樣做了現有的模型和現有的條目,這些會影響較舊的記錄?我是否需要運行任何代碼來遷移字段數據或屬性?我假設它以不同的方式保存... – 2013-04-09 21:32:42

+0

是的,它確實會以不同的方式影響,請查看「可成像」背後的文檔中的遷移文件或您的「可光照」界面中的遷移文件,它不包含額外的列來區分多態關聯。你仍然處於發展階段,對吧?如果不是爲其他表創建單獨的照片表或修改它,但控制檯 – Zippie 2013-04-09 21:39:53

+0

我試圖在文檔中找到此遷移文件。你能給我一個鏈接嗎?它已經在生產中,所以如果我修改模型,我將不得不通過控制檯修改記錄。但我在如何做到這一點的損失... – 2013-04-09 22:14:00

相關問題