我一直在阅读ActiveRecord下可能存在的各种类型的关系,我在那个位置,我认为我理解抽象中的所有细节,但他们并没有真正点击对我来说。我真的很感激在这个问题上提出一些建议。
在我的练习应用程序中,我正在处理四个具体的事情:观众,电视节目,这些节目的光盘和剧集。然后有一个抽象的东西,观众< - >节目或'订阅'/'谁看谁的关系,这是我遇到麻烦的地方。
Owner
观看多个Show
s。Show
都有许多Episode
s。Episode
属于一个Show
。Owner
拥有许多Disc
个。 Disc
属于某个节目,但上面有很多Episode
。Disc
可以拥有相同的Owner
,但需要有办法查看Owner
是否拥有特定的Disc
- 事实他们只是看Show
所属的Disc
是不够的,必须有一个布尔'拥有?'某处。我需要提取数据以巧妙地回答如下问题:
Subscription
belongs_to :owner
和belongs_to :show
subscriptions
,其中有两列:t.references :owner
,t.references :show
Owner
has_many :discs
和has_many :shows, through: :subscriptions
Show
has_many :discs
和has_many :owners, through: :subscriptions
Show
has_many :episodes
Episode
belongs_to :show
和belongs_to :disc
Disc
has_many :episodes
和belongs_to_many :owners
它只是模糊不清,在我的脑海中混乱,我不确定如何使用联接表,或者使用has_and_belongs_to_many
是否合适。我今天已经嘲笑了几次,但是试图确定查询和不熟悉的语法并试图掌握或正确创建关系的组合导致了一些挫折和混乱。我真的很感激有人指出我犯过的一些错误,让我知道'Railsy'这样做的方法,或解释正确的关系结构应该是什么。
答案 0 :(得分:1)
以下是我要做的事情:
拥有者:
has_many: subscriptions
has_many: disks, through: :subscriptions
显示:
has_many :episodes
has_many :disks
集数:
belongs_to :show
belongs_to :disk
磁盘:
belongs_to :show
has_many :subscriptions
has_many :owners, through: :subscriptions
has_many :episodes
订阅:
belongs_to: owner
belongs_to: disk
那应该有用。唯一不存在所有者 - 显示关系的东西。而且我认为这是最好的,因为真的没有真实的联系。唯一真正的连接是通过磁盘(如果您不拥有节目的任何磁盘,那么您不会观看该节目)。你可以做些什么来获得所有节目owner
手表(反之亦然)是:
@shows = @owner.disks.map(&:show).flatten.uniq
@owners = @show.disks.map(&:owners).flatten.uniq
最后两行是未经测试的,但我相信它们应该可以正常工作。