【问题标题】:Best way to structure has_many through with several models?通过多个模型构建 has_many 的最佳方法?
【发布时间】:2013-09-18 14:54:58
【问题描述】:

我正在建立一个教科书数据库。 Book 看起来像这样:

图书

  • 身份证
  • 标题
  • isbn
  • 作者
  • 主题
  • 大学
  • 教授

虽然一本书(显然)只有一个标题或 ISBN - 我希望作者、学科、大学和教授成为一种“标签”。一本书可以由多个作者撰写,用于多个教授教授的多个课程中的多个科目。所以我想为每一个建立一个多对多的关系。例如Author 可能类似于:

作者

  • 身份证
  • 姓名
  • 书籍

对于我来说,书属于作者并不一定有意义,反之亦然(尽管我可能是错的。)但我也不知道创建 book_author_associations 表,book_jubjects_associations 模型,book_classes_associations 模型等。

像这样创建多个多对多的最佳方法是什么?

【问题讨论】:

  • 如果您不想创建连接模型,您可以使用 has_and_belongs_to_many 类型的关联。它们只在您的数据库中获取一个连接表,但没有额外的 ActiveRecord 模型。更多信息:guides.rubyonrails.org/association_basics.html
  • 多态关联?像 BookAssociations 这样的模型引用 book_id、related_object_id 和 associated_object_type?

标签: ruby-on-rails


【解决方案1】:

没有测试,但理论上应该可行:

Book
  has_many :book_associations
  has_many :associations, through: :book_associations

BookAssociation
  belongs_to :book
  belongs_to :association, polymorphic: true
  validates :book_id, presence: true
  validates :association_id, presence: true
  validates :association_type, presence: true

Author
  has_many :book_associations, as: :association
  has_many :books, through: :book_associations

Subject
  has_many :book_associations, as: :association
  has_many :books, through: :book_associations

【讨论】:

    【解决方案2】:

    在这种情况下,连接表是不可避免的。

    您应该继续为课程、主题、作者等创建单独的表格,因为它们具有非常不同的属性。您应该通过连接表将它们与书籍关联起来,这些连接表在大多数情况下都有自己的属性。

    例如,一本书的撰稿人可以是作者,也可以是编辑、摄影师、翻译或任何数量的其他角色,而该角色将是图书之间关联的一个属性和作者(最好称他们为贡献者)。

    有关此类事情的更多信息,您可以查看 EDITEUR 的 Onix 代码列表,了解有关书籍元数据结构的想法。 http://www.editeur.org/14/Code-Lists/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多