我有一 table 人。我也有一个事件表;每个事件都有多个节目(每个节目有多张门票,每张门票可能有也可能没有买家(一个人)。尽管如此,每个人可以拥有多张不同事件的门票。

我目前的尝试是这样的:

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?

我如何找到所有拥有特定事件门票的人?

最佳答案

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

  • 人内联票 将为您拥有的每张票排成一行
    由一个人(如果一个人有多张票,则将包含重复的人条目)
  • 内连接显示 只是将显示添加到行
    (假设每张票只属于一个节目)
  • 内连接事件 只会添加事件信息(假设每个节目只属于一个事件)
  • 其中 event.id=1 将只在表中保留事件 id 为 1
  • 的行

    我想这就是你要找的。

    顺便说一句,上面代码中的命名约定表明您可能对关系的定义有问题。我希望它是:
    Person.joins(tickets: {show: :event}) 而不是
    Person.joins(tickets: {shows: :events}) 因为门票属于单个节目并且节目属于单个事件。我错过了什么吗?

    关于sql - Rails 中具有多个连接的高级查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11417287/

    10-11 01:36