除了遍布互联网的许多文章和文档之外,我还阅读了很多关于连接表,STI表和多态关联的问题和答案。虽然我学到了很多东西,但我仍然对在我的情况下应该做些什么感到困惑。我可能已经阅读了答案而不知道我正在阅读答案,但我想知道是否有人可以帮助我理解我应该在这里做什么。
我有一个Gallery模型,一个Album模型,一个Image模型和一个Category模型。这些都嵌套在用户模型中。
创建相册时,为其分配一个类别,并使用Album_Categories模型保存这些类别。我希望Gallery模型知道哪些类别存在,并能够选择它想要使用哪些类别。
一旦选择了一个类别,它就应该能够访问与类别和相册图像相关联的相册,这些相册通过和Album_Images连接表进行链接。即使最初创建的相册或图库被删除,该类别也应该能够继续存在,以便其他相册或图库可以在以后利用它。
我的感觉是,无论何时创建一个独特的类别,都应该通过Category_Galleries模型连接到Gallery,但是在我使用连接到Gallery和Album的Images以及它们自己的特定连接表时,Gallery不知道Album_images连接,所以我假设分享由另一个创建的类别的知识将是相同的。
任何方式来帮助我,我将不胜感激。
编辑:型号代码
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 :(得分:1)
这实际上取决于您尝试建模的要求。这是否准确反映了您的要求? (忽略用户当前时刻,不一定详细说明rails关联)
如果是这样,你可以简单地:
即使在关系被破坏之后,has_many将允许你的类别,画廊,专辑和图像存在。
目前我认为不需要STI或多态性。通常,当两个模型共享(拥有)同一个表时,您使用多态关联。但是既然你会通过关联使用has_many,那么甚至不需要多态。 (它可以防止在拥有的表中作为外键出现时拥有的表id的冲突。)
要从图库中获取图像,例如,您实际上将显示属于分配给图库的所有类别的所有相册的所有图像。这可以通过关联和查询来完成。
所以基本上,我不认为你的场景......基于我的理解......过于复杂,并且通过关联已经足够了。
一个有趣的问题是,为什么用户与您的所有模型相关联。他们是否负责创建/与用户关联的模型实例?