关于Rails中正确关联的问题

以这种情况为例。

你有3个型号:

  1. 诗人 – 代表一首诗的作者
  2. 诗 – 代表诗人写的一首诗
  3. 打印 – 表示包含诗人诗歌的任何类型的印刷出版物。

蝙蝠诗人和诗歌是显而易见的:

  • 诗人有很多诗
  • 诗歌belongs_to诗人

在处理Printing模型时,我会感到困惑。

在这种情况下,印刷在某种意义上属于诗人和诗。 你可以说一个诗人has_many印刷品或诗歌has_many印刷这是有道理的,但走向相反的路线是棘手的…

一些杂志或书籍从一位诗人那里打出5首诗的情况怎么样? 或者,其中一首诗出版在10种不同的杂志上?

几乎看起来印刷本身“属于许多”诗歌或诗人。 我知道这是错的,但我只想说清楚这一点。

所以可回答的问题是:你将如何建立这些关系? 具体来说,模型和数据库表的外观如何?如何使用它们来访问关联数据?

谢谢!

一些杂志或书籍从一位诗人那里打出5首诗的情况怎么样?

记住,如果你有一位诗人,有许多诗歌和印刷,有很多诗歌,你也可以得到诗人。

Poet.poems.first.printings将返回诗人第一首诗的所有印刷品

或者你可以做Printing.poems.first.poet这样你就可以在印刷中得到第一首诗的诗人。

你会如何建立这些关系? 具体来说,模型和数据库表的外观如何?如何使用它们来访问关联数据?

我会像这样设置它

 Poet :has_many poems poem :belongs_to poet poem :has_and_belongs_to_many printings printing :has_many poems 

因为您使用的是has_and_belogs_to_many关联,所以您需要一个连接表,用于诗歌和打印

你会有这样的迁移

 CreatePoemsPrintingJoinTable < ActiveRecord::Migration def self.up create_table :poems_printings, :id => false do |t| t.integer :poem_id t.integer :printing_id end end def self.down drop_table :poems_printings end end 

其他表非常简单

 CreateTablePoems < ActiveRecord::Migration def self.up create_table :poems, do |t| t.integer :poet_id end end def self.down drop_table :poems end end CreateTablePoets < ActiveRecord::Migration def self.up create_table :poets do |t| end end def self.down drop_table :poems end end CreateTablePrintings < ActiveRecord::Migration def self.up create_table :printings do |t| end end def self.down drop_table :printings end end