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