我有一张人的桌子。我还有一个事件表;每个活动都有多个节目(每个节目都有多张票,每张票可能有也可能没有买家(一个人)。每个人可以有多张不同活动的门票。
我目前的尝试是这样的:
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中实现THAT?
如何查找所有拥有特定活动门票的人?
答案 0 :(得分:5)
我也不是数据库专家,但据我所知,这是它的工作方式:
我认为这就是你要找的东西。
BTW,上面代码中的命名约定表明您可能对关系的定义有问题。我希望它是: Person.joins(tickets: {show: :event})
而不是
Person.joins(tickets: {shows: :events})
因为票证属于单个节目并且显示属于单个事件。我错过了什么吗?