我有一个教科书模型,我希望有相同教科书的几个版本(允许每个版本有不同的标题,价格等),并能够检索特定教科书的所有版本。你会如何设计这种关系?
我的想法是将本书的第一个实例作为根本书并将所有后续书籍版本与之相关联。例如,如果我要删除根本书,则应从现有版本中自动选择另一个任意根。
我已经看过Ancestry宝石了,但考虑到我的树最大深度为1,它看起来有点过分了。再次,我甚至不确定树的结构是否合适溶液
答案 0 :(得分:4)
在现实世界中,书籍很乱。
我不确定我曾经看过一本书的多个版本有不同的标题,但我想没有法律可以解决这个问题。如果真的能发生这种情况,那么我们可能需要按照一系列版本的方式来思考这些版本的任意集合。
假设我们从这开始。想象一下,不同版本的标题可能会有所不同,尽管它们不适用于这本实际的书籍。 (Larson的微积分和Spivak的微积分。)
Title ISBN Price Edition -- Calculus 128505709-0 $235.34 10 Calculus 128509108-6 $ 86.50 10 Calculus 054716702-4 $290.65 9 Calculus 061850298-X $ 67.96 8 Calculus 039586974-9 $ 56.99 6 Calculus 091409891-8 $ 80.75 4
我们无法按标题选择一组版本,因为我们会让版本之间的版本不同,并且因为相同的标题可以由不同的作者编写。 (上面的前五个是Larson的微积分;最后一个是Spivak的微积分,一个完全不同的教科书。)一个版本可以由不同的出版商出版,在这种情况下标题作者(未显示)和版本将是相同的,ISBN将是不同的。 (通常,标题的精装本和平装本由不同的出版商出版。)
这意味着我们需要另一张桌子。
Edition name ISBN -- Larson's Calculus 128505709-0 Larson's Calculus 128509108-6 Larson's Calculus 054716702-4 Larson's Calculus 061850298-X Larson's Calculus 039586974-9 Spivak's Calculus 091409891-8
一方面,很明显,我们需要获取有关一组版本的所有信息。只需加入ISBN即可。当然,在Rails中,你可能会在整个过程中使用id号。
版本名称可能是一个标题,但我们让一本书的版本之间的标题不同。因此,选择一个标题可能会导致比它解决的问题更多的问题。
所以我认为你不需要另一个宝石来处理这个问题。还有一个模型和正确的关联。
答案 1 :(得分:0)
我可能会为此设置一个简单的has_many
/ belongs_to
关联:
#app/models/book.rb
Class Book < ActiveRecord::Base
has_many :editions
end
#app/models/edition.rb
Class Edition < ActiveRecord::Base
belongs_to :book
end
这将为您提供架构:
#books
id | title | author | created_at | updated_at
#editions
id | book_id | ISBN | price | created_at | updated_at
这样,您就可以@book
与特定的title
/ author
保存,然后根据需要将editions
与该图书相关联。
答案 2 :(得分:0)
采用自我指涉的方式被证明是最简单的方法。我设计它的方式是添加到数据库的第一个版本是root,所有后续版本通过parent_id
属性引用它。然后,许多验证确保此类结构的完整性(例如,一组版本只能有一个根,删除根本书会自动从现有书籍版本中选择另一个根等)。