【问题标题】:Advanced query in Rails with multiple joinsRails 中具有多个连接的高级查询
【发布时间】:2012-07-10 03:56:12
【问题描述】:

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

我目前的尝试是这样的:

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?

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

【问题讨论】:

  • 这个查询实际上会返回人而不是票。你能澄清一下你的目标吗?
  • 我想找到所有持有特定活动门票的人。
  • 所以我认为您的查询应该可以解决问题。当一个人拥有不止一张票时,您是否期待不同的东西?
  • 如果一个人有不止一张票,那么他们不是每行只有一张退票吗?这并不能保证返回的票证与我要查找的事件匹配的票证是同一张票。因此,如果一个人购买了多个活动的门票,如果查询返回错误的门票,我很可能会错过他们。这就是为什么我认为我可能需要一个正确的外部连接。不知道如何实现它。

标签: sql ruby-on-rails activerecord join


【解决方案1】:

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

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

我想这就是你要找的。​​p>

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

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

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

【讨论】:

  • 就是这样。我没想到人们会乘以门票的数量,但这就是我正在寻找的结果。查询正常,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 2012-08-24
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多