1

我找到了一些关于 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”吗?他们的问题或担忧等?

先感谢您。

4

1 回答 1

5

像这样的东西可能适合你的情况?

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,即系列/书籍

在 has_many 和 belongs_to 中使用 foreign_key 可能会令人困惑:在此处阅读 - http://guides.rubyonrails.org/association_basics.html

于 2012-12-22T18:54:58.760 回答