在多个连接的Rails中的高级查询

问题描述:

我有一张人的表格。我也有一个事件表;每个活动都有多个节目(每个节目有多张门票,每张门票可能有也可能没有买家(一个人),但每个人可以有多张门票可以参加不同的活动)在多个连接的Rails中的高级查询

我目前的尝试如下所示:

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?

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

+0

此查询实际上会返回人员而不是门票。你能否澄清你的目标? – davidrac 2012-07-10 16:04:16

+0

我想找到所有有特定活动门票的人。 – Judy 2012-07-10 16:10:13

+0

所以我认为你的查询应该做的伎俩。当一个人拥有多张票时,你是否期望有所不同? – davidrac 2012-07-10 16:23:04

我也没有一个DB专家,但据我了解,这是它的方式将工作:

  1. 人民内部联接门票会给你一排资 每票由人(其中将包含重复的条目的人,如果一个人有一个以上的票)
  2. 内连接显示将只需添加秀行 (假设每票属于一个节目只)
  3. 内部联接事件将只需要添加的事件信息(假设每显示仅属于一个事件)
  4. 其中event.id = 1将在表仅留下与事件ID的行1

我认为这是你要找的。

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

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

Person.joins(tickets: {shows: :events})因为票belongs_to的一支独秀,并显示belongs_to的单个事件。我错过了什么吗?

+0

就是这样。我没有想到人们会乘上那些门票的数量,但那是我寻找的结果。查询正在运行,谢谢! – Judy 2012-07-18 19:37:51