Skip to content

The join order of tables has been changed in Rails6 #38597

@skuwa229

Description

@skuwa229

The join order of tables has been changed in Rails6.
So, An error occurs when trying to use a column from a non-joined table for join.

Steps to reproduce

class Book < ApplicationRecord
  has_many :book_authors
end

class BookAuthor < ApplicationRecord
  belongs_to :book
  belongs_to :author
end

class Author < ApplicationRecord
  has_one :book_author
  has_one :name
end

class Name < ApplicationRecord
  belongs_to :author
end


Book.left_outer_joins(:book_authors).merge(BookAuthor.left_outer_joins(:author).merge(Author.left_outer_joins(:name)))

Expected behavior

in Rails 5.2.4.1

Book.left_outer_joins(:book_authors).merge(BookAuthor.left_outer_joins(:author).merge(Author.left_outer_joins(:name)))
  Book Exists (1.9ms)  SELECT  1 AS one FROM `books` LEFT OUTER JOIN `book_authors` ON `book_authors`.`book_id` = `books`.`id` LEFT OUTER JOIN `authors` ON `authors`.`id` = `book_authors`.`author_id` LEFT OUTER JOIN `names` ON `names`.`author_id` = `authors`.`id` LIMIT 1
[]

Actual behavior

in Rails 6.0.2.1

Book.left_outer_joins(:book_authors).merge(BookAuthor.left_outer_joins(:author).merge(Author.left_outer_joins(:name)))
   (1.8ms)  SET NAMES utf8mb4 COLLATE utf8mb4_general_ci,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  Book Exists? (1.9ms)  SELECT 1 AS one FROM `books` LEFT OUTER JOIN `book_authors` ON `book_authors`.`book_id` = `books`.`id` LEFT OUTER JOIN `names` ON `names`.`author_id` = `authors`.`id` LEFT OUTER JOIN `authors` ON `authors`.`id` = `book_authors`.`author_id` LIMIT 1
(pry) output error: #<ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'authors.id' in 'on clause'>

System configuration

Rails version:
Rails 6.0.2.1

Ruby version:
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions