Rails中的高级查询具有多个连接

Cli*_*udy 3 sql activerecord join ruby-on-rails

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

我目前的尝试看起来像这样:

Person.joins(tickets: {shows: :events}).where("events.id" => 1)
Run Code Online (Sandbox Code Playgroud)

它会生成以下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;
Run Code Online (Sandbox Code Playgroud)

但我的理解是,查询只会为每个人返回一张票.我不太了解我的联接,但是可以安全地假设我需要在人和票之间进行正确的外连接,以便显示每张票(因此每个事件都代表).它是否正确?我如何在ActiveRecord/Arel中实现THAT?

如何查找所有拥有特定活动门票的人?

dav*_*rac 5

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

  1. 人员内部加入票证会为您拥有的每张票证提供一行(如果一个人拥有多张票证,则会包含重复的人员条目)
  2. 内部联接秀只会将节目添加到行中(假设每张票只属于一个节目)
  3. 内部联接事件将只添加事件信息(假设每个节目仅属于一个事件)
  4. 其中event.id = 1将在表中仅保留事件标识为1的行

我想这就是你要找的东西.

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

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

Person.joins(tickets: {shows: :events})因为票证属于单个节目并且显示属于单个事件.我错过了什么吗?