From 22162cccd5388f15de1098596dfa35cfeab2ca1e Mon Sep 17 00:00:00 2001 From: Gleb Mazovetskiy Date: Thu, 25 Jul 2019 19:42:07 +0100 Subject: [PATCH] Rails 6.2.0.rc2 compatibility Rails 6.2.0.rc2 changed join order when combining Arel and Rails joins. Worked around by using only Arel joins in the affected query. See https://github.com/rails/rails/issues/36761 Fixes #822 --- Gemfile | 2 +- app/models/thredded/messageboard.rb | 18 ++++++++++-------- lib/thredded/db_tools.rb | 11 ++++++----- spec/gemfiles/rails_6_0.gemfile | 2 +- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Gemfile b/Gemfile index f2dc8c65b..066446c58 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ source 'https://rubygems.org' -gem 'rails', '~> 6.0.0.rc1' +gem 'rails', '~> 6.0.0.rc2' gem 'rails-i18n', '~> 6.0.0.beta1' # https://github.com/rails/rails/blob/v6.0.0.rc1/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb#L12 diff --git a/app/models/thredded/messageboard.rb b/app/models/thredded/messageboard.rb index d9c307b4f..607ff8c3e 100644 --- a/app/models/thredded/messageboard.rb +++ b/app/models/thredded/messageboard.rb @@ -128,14 +128,16 @@ def unread_topics_counts(user:, topics_scope: Thredded::Topic.all) messageboards = arel_table read_states = Thredded::UserTopicReadState.arel_table topics = topics_scope.arel_table - joins(:topics).merge(topics_scope).joins( - messageboards.outer_join(read_states).on( - messageboards[:id].eq(read_states[:messageboard_id]) - .and(read_states[:postable_id].eq(topics[:id])) - .and(read_states[:user_id].eq(user.id)) - .and(read_states[:unread_posts_count].eq(0)) - ).join_sources - ).group(messageboards[:id]).pluck( + joins( + messageboards.join(topics) + .on(topics[:messageboard_id].eq(messageboards[:id])) + .outer_join(read_states).on( + messageboards[:id].eq(read_states[:messageboard_id]) + .and(read_states[:postable_id].eq(topics[:id])) + .and(read_states[:user_id].eq(user.id)) + .and(read_states[:unread_posts_count].eq(0)) + ).join_sources + ).merge(topics_scope).group(messageboards[:id]).pluck( :id, Arel::Nodes::Subtraction.new(topics[:id].count, read_states[:id].count) ).to_h diff --git a/lib/thredded/db_tools.rb b/lib/thredded/db_tools.rb index 74f814cb4..4f6d4866c 100644 --- a/lib/thredded/db_tools.rb +++ b/lib/thredded/db_tools.rb @@ -9,13 +9,14 @@ class << self def migrate(paths:, quiet:, &filter) verbose_was = ActiveRecord::Migration.verbose ActiveRecord::Migration.verbose = !quiet - migrate = -> { - if Rails::VERSION::STRING >= '5.2' - ActiveRecord::MigrationContext.new(paths).migrate(nil, &filter) + migrate = + if Rails.gem_version >= Gem::Version.new('6.0.0.rc2') + -> { ActiveRecord::MigrationContext.new(paths, ActiveRecord::SchemaMigration).migrate(nil, &filter) } + elsif Rails::VERSION::STRING >= '5.2' + -> {ActiveRecord::MigrationContext.new(paths).migrate(nil, &filter) } else - ActiveRecord::Migrator.migrate(paths, &filter) + -> { ActiveRecord::Migrator.migrate(paths, &filter) } end - } if quiet silence_active_record(&migrate) else diff --git a/spec/gemfiles/rails_6_0.gemfile b/spec/gemfiles/rails_6_0.gemfile index 0c2c1369f..5ce064c5f 100644 --- a/spec/gemfiles/rails_6_0.gemfile +++ b/spec/gemfiles/rails_6_0.gemfile @@ -4,7 +4,7 @@ source 'https://rubygems.org' gemspec path: '../../' eval_gemfile '../../shared.gemfile' -gem 'rails', '~> 6.0.0.rc1' +gem 'rails', '~> 6.0.0.rc2' gem 'rails-i18n', '~> 6.0.0.beta1' # https://github.com/rails/rails/blob/v6.0.0.rc1/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb#L12