关于Rails中正确关联的问题
以这种情况为例。
你有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