0

除了許多文章和文檔遍及互聯網,我已閱讀了很多關於連接表,STI表和多態關聯的問題和解答。雖然我學到了很多東西,但我仍然對我在這種情況下應該做的事感到困惑。我可能已經閱讀了答案,但並不知道我正在閱讀答案,但我想看看是否有人能夠幫助我理解我應該在這裏做什麼。加入表格混淆Ruby on Rails

我有一個Gallery模型,一個Album模型,一個Image模型和一個Category模型。這些都嵌套在用戶模型中。

當您創建一個專輯時,爲它指定一個類別,並用一個Album_Categories模型保存它們。我希望Gallery模型知道類別的存在,並能夠選擇想要使用的類別。

一旦它選擇一個類別,它應該能夠訪問與該類別相關聯的專輯和通過和Album_Images連接錶鏈接的專輯的圖像。即使最初創建的「專輯」或「圖庫」被刪除,該類別也應該能夠繼續存在,以便其他專輯或圖庫可以在以後使用。

我的感覺是,無論什麼時候創建一個獨特的類別,應該如何通過Category_Galleries模型連接到Gallery,但是在使用連接到具有其自己的特定連接表的Gallery和Album的圖像時,Gallery不知道一個Album_images連接,所以我假設分享由另一個創建的類別的知識將是相同的。

任何方式來幫助我unerstand這將不勝感激。

編輯:型號代碼

class User < ActiveRecord::Base 
    has_many :images, dependent: :destroy 
    has_many :galleries, dependent: :destroy 
    has_many :albums, dependent: :destroy 
    has_many :categories, dependent: :destroy 
    accepts_nested_attributes_for :images, :galleries, :albums, :categories, allow_destroy: true 
    accepts_attachments_for :images, attachment: :file, append: true 
end 



class Image < ActiveRecord::Base 
    belongs_to :user 

    has_many :gallery_images, dependent: :destroy 
    has_many :galleries, through: :gallery_images 

    has_many :album_images, dependent: :destroy 
    has_many :albums, through: :album_images 

    attachment :file, type: :image 
    validates :file, presence: true 
end 

class Album < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 

    has_many :album_galleries 
    has_many :galleries, through: :album_galleries # , dependent: :destroy 

    has_many :album_images, dependent: :destroy 
    has_many :images, through: :album_images 

    has_many :album_categories 
    has_many :categories, through: :album_categories 

    accepts_attachments_for  :images, attachment: :file, append: true 
    accepts_nested_attributes_for :images 
end 

class Gallery < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 

    has_many :gallery_images, dependent: :destroy 
    has_many :images, through: :gallery_images 

    has_many :album_galleries, dependent: :destroy 
    has_many :albums, through: :album_galleries 

    accepts_attachments_for  :images, attachment: :file, append: true 
    accepts_nested_attributes_for :images 
end 

class Category < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 

    has_many :albums, through: :album_categories 
    has_many :album_categories 
end 

class GalleryImage < ActiveRecord::Base 
    belongs_to :gallery 
    belongs_to :image 
end 
class AlbumCategory < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :album 
end 
class AlbumGallery < ActiveRecord::Base 
    belongs_to :gallery 
    belongs_to :album 
end 
class AlbumImage < ActiveRecord::Base 
    belongs_to :album 
    belongs_to :image 
end 
+0

請添加您的模型的代碼,特別是關聯定義。 –

+0

畫廊是否有自己的一套圖像,或者是否由所有相關的相冊圖像推導出來? – hypern

+0

如果類別與畫廊和相冊關聯到一個類別,那麼您可以通過檢查畫廊所有類別的所有相冊中的所有圖像,找到所有與代理相關的圖像。 – hypern

回答

1

這真的取決於你想建模的要求。這是否準確地反映了您的要求? (忽略當前時刻的用戶,不一定詳細軌協會)

  • 的走廊可以由許多類別的
  • 類別可以包含多張唱片
  • 的專輯可以有許多圖像

如果是這樣,你可以簡單地有:

  • 通過畫廊和貓之間的關聯一個的has_many egories
  • 通過和藝術館
  • 一個的has_many之間的關聯一個的has_many通過相冊和圖片

的的has_many之間的關聯,通過將使您的類別,畫廊,相冊和圖片的關係被破壞後也存在。

目前我沒有看到任何需要STI或多態性。當兩個模型共享(擁有)同一個表時,通常使用多態關聯。但是因爲你會通過關聯使用has_many,多態性甚至不是必需的。 (它防止在擁有的表中作爲外鍵出現擁有表id的衝突)。

要從圖庫中獲取圖像,例如,您基本上會顯示屬於分配給圖庫的所有類別的所有相冊的所有圖像。這可以通過關聯和查詢來完成。

所以基本上,我不認爲你的情況...根據我的理解...太複雜,has_many通過關聯應該足夠。

一個有趣的問題是爲什麼用戶與您的所有模型相關聯。他們是否負責創建用戶所關聯的模型實例?

+0

我不確定我是否理解你的最後一個問題,但是我的推理,無論是否有錯誤,我都不確定是否保護這些實例不會被未創建它們的用戶的實例看到。因此,如果user1創建了一個充滿相冊和圖像的畫廊,user2無法看到user1的畫廊等。我做了什麼矯枉過正,我可以從一切中刪除user_id?此外,還要感謝您提供其他信息,我正在考慮如何應用它以及需要採取什麼措施。 – Lenocam

+0

與你的建議,說畫廊有一個類別「魚」和專輯有一個類別「魚」。是@ gallery.categories(名稱:「Fish」)== @ album.categories(名稱:「Fish」)的「Fish」實例。如果是這樣,我想我知道如何前進,如果沒有,我需要做些什麼才能使他們彼此平等? – Lenocam

+0

用戶關聯沒有任何問題,我只是很好奇你爲什麼說什麼以及你說的是什麼總是有意義的 - 如果讓這個圖庫的用戶是相同的,並且是唯一一個製作相冊,類別等的用戶,那麼你可能可能只需將user_id放入畫廊中並從關聯中推斷即可。 – hypern