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

标签 sql ruby-on-rails activerecord join

我有一 table 人。我还有一个事件表; each event has multiple shows(, 每场演出有多张票,每张票可能有也可能没有买家(一个人)。虽然每个人可以有多张不同事件的门票。

我目前的尝试是这样的:

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 中实现它?

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

最佳答案

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

  1. people inner join tickets 将为您拥有的每张票生成一行 由一个人(如果一个人有不止一张票,它将包含重复的人条目)
  2. inner join show 只会将节目添加到行中 (假设每张票只属于一个节目)
  3. inner join event 只会添加事件信息(假设每个节目只属于一个事件)
  4. where event.id=1 将只在表中保留事件 ID 为 1 的行

我想这就是您要找的。

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

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

Person.joins(tickets: {shows::events}) 因为票属于一个节目,而节目属于一个事件。我错过了什么吗?

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

相关文章:

mysql - 如何使用具有特定值的列数对表重新排序

ruby-on-rails - 我的 Rails Javascript list 文件既不编译也不包含任何必需的文件

ruby-on-rails - 没有成员id的资源路由

ruby-on-rails - `fetch' : key not found: "S3_BUCKET_NAME" (KeyError) with paperclip/aws s3/rails

ruby-on-rails - 代码读取 : why is the following code implemented like this?

sql - 具有动态列的透视 SQL 表

sql - 在 SQL Server 的列中查找第一个匹配的字符串

sql - 将字符串行拆分为多列 - PostgreSQL

mysql - 如何使用 Laravel 的流畅查询构建器选择计数?

ruby-on-rails - 反序列化的 Rails ActiveRecord 对象不会保存到 SQL 数据库