Skip to content

Erroneous double-join when using pluck #1108

@MOZGIII

Description

@MOZGIII

I noticed odd behavior when using ransack and invoking pluck:

[60] pry(main)> Visitor.includes(:automated_campaign_receipts).where(automated_campaign_receipts: { automated_campaign_id: 10 }).where(automated_campaign_receipts: { event_type: 'clicked' }).pluck(:id)
   (0.3ms)  SELECT "visitors"."id" FROM "visitors" LEFT OUTER JOIN "automated_campaign_receipts" ON "automated_campaign_receipts"."visitor_id" = "visitors"."id" WHERE "automated_campaign_receipts"."automated_campaign_id" = $1 AND "automated_campaign_receipts"."event_type" = $2  [["automated_campaign_id", 10], ["event_type", 3]]
=> []
[61] pry(main)> Visitor.includes(:automated_campaign_receipts).where(automated_campaign_receipts: { automated_campaign_id: 10 }).ransack({automated_campaign_receipts_event_type_eq: 'clicked'}).result.pluck(:id)
   (0.3ms)  SELECT "visitors"."id" FROM "visitors" LEFT OUTER JOIN "automated_campaign_receipts" ON "automated_campaign_receipts"."visitor_id" = "visitors"."id" LEFT OUTER JOIN "automated_campaign_receipts" "automated_campaign_receipts_visitors" ON "automated_campaign_receipts_visitors"."visitor_id" = "visitors"."id" WHERE "automated_campaign_receipts"."automated_campaign_id" = $1 AND "automated_campaign_receipts"."event_type" = 3  [["automated_campaign_id", 10]]
=> []

For the purposes of this example, it's irrelevant that both queries result in an empty array.

I must be doing something wrong, but I expected both invocations to result in the same SQL. In fact, what I need is for there to be just one join. How can achieve this? I feel like this is a bug, but it may as well be intended behavior.

Some additional details:

Visitor has many automated_campaign_receipts
AutomatedCampaign has many automated_campaign_receipts
AutomatedCampaignReceipt belongs to visitor
AutomatedCampaignReceipt belongs to automated_campaign

Note that is only happening with pluck, with regular selects everything is ok:

[80] pry(main)> Visitor.includes(:automated_campaign_receipts).where(automated_campaign_receipts: { automated_campaign_id: 10 }).where(automated_campaign_receipts: { event_type: 'clicked' }).to_a
  SQL (1.9ms)  SELECT "visitors"."id" AS t0_r0, ..., "automated_campaign_receipts"."id" AS t1_r0, ... FROM "visitors" LEFT OUTER JOIN "automated_campaign_receipts" ON "automated_campaign_receipts"."visitor_id" = "visitors"."id" WHERE "automated_campaign_receipts"."automated_campaign_id" = $1 AND "automated_campaign_receipts"."event_type" = $2  [["automated_campaign_id", 10], ["event_type", 3]]
=> []
[81] pry(main)> Visitor.includes(:automated_campaign_receipts).where(automated_campaign_receipts: { automated_campaign_id: 10 }).ransack({automated_campaign_receipts_event_type_eq: 'clicked'}).result.to_a
  Visitor Load (1.3ms)  SELECT "visitors".* FROM "visitors" LEFT OUTER JOIN "automated_campaign_receipts" ON "automated_campaign_receipts"."visitor_id" = "visitors"."id" WHERE "automated_campaign_receipts"."automated_campaign_id" = $1 AND "automated_campaign_receipts"."event_type" = 3  [["automated_campaign_id", 10]]
=> []

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions