【问题标题】:Join Table Confusion Ruby on Rails加入表混淆 Ruby on Rails
【发布时间】:2016-06-30 15:17:36
【问题描述】:

我在这里阅读了很多关于连接表、STI 表和多态关联的问题和答案,此外还有许多遍布互联网的文章和文档。虽然我学到了很多东西,但我仍然对在我的情况下应该做什么感到困惑。我可能已经阅读了答案,但不知道我正在阅读答案,但我想看看是否有人可以帮助我了解我应该在这里做什么。

我有一个 Gallery 模型、一个 Album 模型、一个 Image 模型和一个 Category 模型。这些都嵌套在 User 模型中。

当您创建专辑时,为其分配一个类别,这些类别将与 Album_Categories 模型一起保存。我希望 Gallery 模型知道存在哪些类别,并能够选择它想要使用的类别。

一旦它选择了一个类别,它应该能够访问与该类别关联的相册和相册的图像,它们通过和 Album_Images 连接表链接。即使删除了最初创建类别的专辑或画廊,该类别也应该能够继续存在,以便其他专辑或画廊以后可以利用它。

我的感觉是,每当创建一个独特的类别时,都应该通过 Category_Galleries 模型连接到 Gallery,但是在我使用通过自己特定的连接表连接到 Gallery 和 Album 的图像时,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

【问题讨论】:

  • 请添加您的模型代码,特别是关联定义。
  • 画廊是否有自己的图像集,还是由所有相关的专辑图像推导出来的?
  • 如果类别关联到一个画廊,而相册关联到一个类别,那么您可以通过检查画廊所有类别的所有相册的所有图像来找到与画廊替代关联的所有图像.
  • @hypern 现在画廊有它自己的图像,但我一直在拼凑这个,我开始考虑删除这方面并转向画廊只有通过共享的相册提供图像具有该特定画廊的类别。编辑:我刚刚看到您的第二个回复,您在第二个回复中描述的是我的目标,但现在我不知道如何与相册和图库共享类别。

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


【解决方案1】:

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

  • 画廊可以包含许多类别
  • 一个类别可以包含许多专辑
  • 一个相册可以有很多张图片

如果是这样,您可以简单地拥有:

  • 通过画廊和类别之间的关联来实现 has_many
  • 通过专辑和类别之间的关联来实现 has_many
  • 通过专辑和图像之间的关联来实现 has_many

has_many through 将允许您的类别、画廊、相册和图像在关系被破坏后仍然存在。

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

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

所以基本上,我不认为你的场景......根据我的理解......太复杂了,通过关联的 has_many 就足够了。

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

【讨论】:

  • 我不确定我是否理解你的最后一个问题,但我的推理,无论它是否错误,我不确定是为了保护这些实例不被未创建的用户实例看到他们。因此,如果用户 1 创建了一个充满专辑和图像的画廊,用户 2 就看不到用户 1 的画廊等。我所做的是否矫枉过正,我可以从所有内容中删除 user_id 吗?还要感谢您提供的其余信息,我正在尝试考虑如何应用它以及我需要改变什么。
  • 按照您的建议,假设画廊有一个类别“鱼”,而相册有一个类别“鱼”。是@gallery.categories(name:"Fish") == @album.categories(name:"Fish") 的“Fish”实例。如果是这样,我想我知道如何前进,如果不是,我需要做什么才能使它们彼此平等?
  • 用户关联没有任何问题,我只是想知道为什么以及您所说的完全有道理 - 如果制作画廊的用户是相同的,并且是制作相册的唯一用户,类别等,那么您可能只需将 user_id 放在画廊中并从关联中推断出来。
  • 要回答您关于鱼的问题,是的,画廊和专辑都将共享相同的鱼。为什么?因为画廊表和专辑表都有一个指向名为“鱼”的类别记录的链接表。鱼是类别表中的记录本身,两个链接表都希望获得相同的类别记录。
猜你喜欢
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多