加入Table Confusion Ruby on Rails

时间:2016-06-30 15:17:36

标签: ruby-on-rails postgresql polymorphic-associations jointable

除了遍布互联网的许多文章和文档之外,我还阅读了很多关于连接表,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

1 个答案:

答案 0 :(得分:1)

这实际上取决于您尝试建模的要求。这是否准确反映了您的要求? (忽略用户当前时刻,不一定详细说明rails关联)

  • 图库可以包含多个类别
  • 类别可以包含许多相册
  • 相册可以有很多图片

如果是这样,你可以简单地:

  • a has_many通过画廊和类别之间的关联
  • a has_many通过相册和类别之间的关联
  • a has_many通过相册和图片之间的关联

即使在关系被破坏之后,has_many将允许你的类别,画廊,专辑和图像存在。

目前我认为不需要STI或多态性。通常,当两个模型共享(拥有)同一个表时,您使用多态关联。但是既然你会通过关联使用has_many,那么甚至不需要多态。 (它可以防止在拥有的表中作为外键出现时拥有的表id的冲突。)

要从图库中获取图像,例如,您实际上将显示属于分配给图库的所有类别的所有相册的所有图像。这可以通过关联和查询来完成。

所以基本上,我不认为你的场景......基于我的理解......过于复杂,并且通过关联已经足够了。

一个有趣的问题是,为什么用户与您的所有模型相关联。他们是否负责创建/与用户关联的模型实例?