【问题标题】:Single-table inheritance with relationships?具有关系的单表继承?
【发布时间】:2012-12-22 18:43:49
【问题描述】:

我找到了一些关于 STI 的好信息,但还没有看到我想做的示例。这是我能想到的最好的例子。我希望能够跟踪两个实体,但它们不需要自己的表。我只需要区分类型(STI 可以做到这一点),但我还需要知道一个实体是否以及如何与另一个实体相关。我将以书籍为例。有些书只是书,但其他实体书是多本书的集合。

桌子:书籍

id | title | author_id | book_id
1, 'Fellowship of the Ring, 34, (NULL)      # is a physical book
2, 'The Two Towers', 34, (NULL)             # is a physical book
3, 'American Gods', 1, (NULL)               # is a physical book
4, 'Complete Lord Of the Rings', 34, (NULL)
5, 'Fellowship of the Ring', 34, 4          # is collected within book id 4
6, 'The Two Towers', 34, 4                  # is also collected within book id 4
etc.

所以我希望能够查询所有书籍的书籍,并了解它们如何以及是否通过“book_id”相互关联

这在 Rails 中可行吗?如果是这样,如何最好地实施?我可以在书籍模型中说“has_many :books”吗?他们的问题或顾虑等?

提前谢谢你。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rails-activerecord


    【解决方案1】:

    这样的方法可能适合您的情况吗?

    class Book < ActiveRecord::Base
      # all attributes of a book
    end
    
    class SeriesBook < Book
      has_many :books, :class_name => "PhysicalBook", :foreign_key => "parent_id"
    end
    
    class PhysicalBook < Book
      belongs_to :series, :class_name => "SeriesBook", :foreign_key => "parent_id"
    end
    

    然后在查询时

    # searches both Series and Physical
    Book.where("title LIKE ?", "#{params[:title]}%") 
    # searches only Series
    SeriesBook.where("title LIKE ?", "#{params[:title]}%") 
    

    您可能会发现您真的希望您的模型与众不同? 系列和书籍而不使用 STI?这会使两者的查询更加复杂,但可能会使应用程序的其余部分更容易理解

    更新:将belongs_to 添加到PhysicalBook,has_many 关联上的类名

    # How would I query a specific collection to see which and how many books it has within it?
    series = SeriesBook.find(0000)
    series.books.length # => how many 
    series.books.each do |book|
      puts book.title
    end
    
    # How would I look at a book and see if it was in a collection and, 
    # if so, the specific ID of the specific collection to which it is associated
    book = PhysicalBook.find(0000)
    puts book.series.title
    puts book.series.id 
    

    图书数据库表最终看起来像

    id # primary key
    title
    # other book columns ....
    type # STI
    parent_id # nullable, used by physical book when part of a series, points to books.id on the series book
    

    另外:阅读这个 - http://rhnh.net/2010/07/02/3-reasons-why-you-should-not-use-single-table-inheritance

    您可能不想要 STI 吗?数据模型看起来与上面类似,但没有 STI,即系列/书籍

    在has_many 和belongs_to 中使用foreign_key 可能会造成混淆:请在此处阅读-http://guides.rubyonrails.org/association_basics.html

    【讨论】:

    • 我想这对我来说不是很清楚。我将如何查询特定的集合以查看其中包含哪些书籍和多少本书?我将如何查看一本书并查看它是否在一个集合中,如果是,那么与它关联的特定集合的特定 ID?
    • 非常有帮助。谢谢@house9。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多