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

时间:2012-07-10 15:59:14

标签: sql ruby-on-rails activerecord join

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

我目前的尝试是这样的:

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?

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

1 个答案:

答案 0 :(得分:5)

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

  1. 人员内部加入门票会为您拥有的每张门票提供一行 由一个人(如果一个人有多张票,将包含重复的人员条目)
  2. 内部联接节目只会将节目添加到该行 (假设每张票只属于一个节目)
  3. 内部联接事件只会添加事件信息(假设每个节目仅属于一个事件)
  4. where event.id = 1 只会在表格中留下事件ID为1的行
  5. 我认为这就是你要找的东西。

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

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

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