3

我有一桌人。我还有一张活动表;每个活动都有多个节目(,每个节目有多个门票,每张门票可能有也可能没有买家(一个人)。但是,每个人都可以拥有多张不同活动的门票。

我目前的尝试如下所示:

Person.joins(tickets: {shows: :events}).where("events.id" => 1)

它会生成以下 SQL:

SELECT *
  FROM "people"
  INNER JOIN "tickets"
    ON "tickets"."buyer_id" = "people"."id"
  INNER JOIN "shows"
    ON "shows"."id" = "tickets"."show_id"
  INNER JOIN "events"
    ON "events"."id" = "shows"."event_id"
WHERE
  "events"."id" = 1;

但我的理解是,查询只会为每个人返回一张票。我不太了解我的加入,但可以安全地假设我需要人和票之间的正确外部加入,以便显示每张票(因此代表每个事件)。这个对吗?以及如何在 ActiveRecord/Arel 中实现它?

如何找到所有持有特定活动门票的人?

4

1 回答 1

5

我也不是数据库专家,但据我所知,这是它的工作方式:

  1. people inner join ticket将为一个人拥有的每张票提供一行(如果一个人拥有多张票,它将包含重复的人员条目)
  2. inner join show只会将节目添加到行中(假设每张票只属于一个节目)
  3. inner join event只会添加事件信息(假设每个节目只属于一个事件)
  4. 其中 event.id=1将仅在表中保留事件 id 为 1 的行

我想这就是你要找的。

顺便说一句,上面代码中的命名约定表明您可能对关系的定义有问题。我希望它是:

Person.joins(tickets: {show: :event})并不是

Person.joins(tickets: {shows: :events})因为门票属于_单个节目和节目属于_单个事件。我错过了什么吗?

于 2012-07-10T17:12:13.363 回答