这里有什么样的联合/模特安排?

时间:2015-03-28 11:56:52

标签: ruby-on-rails activerecord

我一直在阅读ActiveRecord下可能存在的各种类型的关系,我在那个位置,我认为我理解抽象中的所有细节,但他们并没有真正点击对我来说。我真的很感激在这个问题上提出一些建议。

在我的练习应用程序中,我正在处理四个具体的事情:观众,电视节目,这些节目的光盘和剧集。然后有一个抽象的东西,观众< - >节目或'订阅'/'谁看谁的关系,这是我遇到麻烦的地方。

摘要

  • 每个Owner观看多个Show s。
  • 每个Show都有许多Episode s。
  • Episode属于一个Show
  • Owner拥有许多Disc个。
  • Disc属于某个节目,但上面有很多Episode
  • 许多Disc可以拥有相同的Owner,但需要有办法查看Owner是否拥有特定的Disc - 事实他们只是看Show所属的Disc是不够的,必须有一个布尔'拥有?'某处。

我需要提取数据以巧妙地回答如下问题:

  • 用户 X 观看什么节目?
  • 谁观看Show Y
  • 用户 X 拥有多少张光盘?
  • 光盘 Z 上有哪些剧集?
  • 什么剧集都没有?
  • 用户 X 不拥有他们观看的任何节目光盘吗?

我最好的猜测

  • Subscription belongs_to :ownerbelongs_to :show
  • 加入表格subscriptions,其中有两列:t.references :ownert.references :show
  • Owner has_many :discshas_many :shows, through: :subscriptions
  • Show has_many :discshas_many :owners, through: :subscriptions
  • Show has_many :episodes
  • Episode belongs_to :showbelongs_to :disc
  • Disc has_many :episodesbelongs_to_many :owners

问题

它只是模糊不清,在我的脑海中混乱,我不确定如何使用联接表,或者使用has_and_belongs_to_many是否合适。我今天已经嘲笑了几次,但是试图确定查询和不熟悉的语法并试图掌握或正确创建关系的组合导致了一些挫折和混乱。我真的很感激有人指出我犯过的一些错误,让我知道'Railsy'这样做的方法,或解释正确的关系结构应该是什么。

1 个答案:

答案 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

最后两行是未经测试的,但我相信它们应该可以正常工作。