diff options
author | Jasper Maes <jaspermaes.jm@gmail.com> | 2019-01-15 22:05:36 +0100 |
---|---|---|
committer | Heinrich Lee Yu <heinrich@gitlab.com> | 2019-04-23 08:31:23 +0800 |
commit | 624a1cdab4da67c7b363602aa1178d0e6ff63475 (patch) | |
tree | 09892175f885c4c5f6725314b25a61280395efcb | |
parent | 46bdbc5d776a0438366426e0ef48911123311744 (diff) | |
download | gitlab-ce-624a1cdab4da67c7b363602aa1178d0e6ff63475.tar.gz |
Upgrade Rails to 5.1.6.1
Model.new.attributes now also returns encrypted attributes.
43 files changed, 323 insertions, 423 deletions
@@ -1,6 +1,6 @@ source 'https://rubygems.org' -gem 'rails', '5.0.7.2' +gem 'rails', '5.1.6.1' # Improves copy-on-write performance for MRI gem 'nakayoshi_fork', '~> 0.0.4' @@ -18,7 +18,7 @@ gem 'mysql2', '~> 0.4.10', group: :mysql gem 'pg', '~> 1.1', group: :postgres gem 'rugged', '~> 0.28' -gem 'grape-path-helpers', '~> 1.0' +gem 'grape-path-helpers', '~> 1.1' gem 'faraday', '~> 0.12' diff --git a/Gemfile.lock b/Gemfile.lock index ba4418cd8b3..31ffc0fd308 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -4,41 +4,41 @@ GEM RedCloth (4.3.2) abstract_type (0.0.7) ace-rails-ap (4.1.2) - actioncable (5.0.7.2) - actionpack (= 5.0.7.2) - nio4r (>= 1.2, < 3.0) + actioncable (5.1.6.1) + actionpack (= 5.1.6.1) + nio4r (~> 2.0) websocket-driver (~> 0.6.1) - actionmailer (5.0.7.2) - actionpack (= 5.0.7.2) - actionview (= 5.0.7.2) - activejob (= 5.0.7.2) + actionmailer (5.1.6.1) + actionpack (= 5.1.6.1) + actionview (= 5.1.6.1) + activejob (= 5.1.6.1) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.0.7.2) - actionview (= 5.0.7.2) - activesupport (= 5.0.7.2) + actionpack (5.1.6.1) + actionview (= 5.1.6.1) + activesupport (= 5.1.6.1) rack (~> 2.0) - rack-test (~> 0.6.3) + rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.0.7.2) - activesupport (= 5.0.7.2) + actionview (5.1.6.1) + activesupport (= 5.1.6.1) builder (~> 3.1) - erubis (~> 2.7.0) + erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.0.7.2) - activesupport (= 5.0.7.2) + activejob (5.1.6.1) + activesupport (= 5.1.6.1) globalid (>= 0.3.6) - activemodel (5.0.7.2) - activesupport (= 5.0.7.2) - activerecord (5.0.7.2) - activemodel (= 5.0.7.2) - activesupport (= 5.0.7.2) - arel (~> 7.0) + activemodel (5.1.6.1) + activesupport (= 5.1.6.1) + activerecord (5.1.6.1) + activemodel (= 5.1.6.1) + activesupport (= 5.1.6.1) + arel (~> 8.0) activerecord_sane_schema_dumper (1.0) rails (>= 5, < 6) - activesupport (5.0.7.2) + activesupport (5.1.6.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) @@ -52,7 +52,7 @@ GEM public_suffix (>= 2.0.2, < 4.0) aes_key_wrap (1.0.1) akismet (2.0.0) - arel (7.1.4) + arel (8.0.0) asana (0.8.1) faraday (~> 0.9) faraday_middleware (~> 0.9) @@ -186,7 +186,6 @@ GEM encryptor (3.0.0) equalizer (0.0.11) erubi (1.7.1) - erubis (2.7.0) escape_utils (1.2.1) et-orbi (1.1.7) tzinfo @@ -257,8 +256,8 @@ GEM fog-xml (0.1.3) fog-core nokogiri (>= 1.5.11, < 2.0.0) - font-awesome-rails (4.7.0.1) - railties (>= 3.2, < 5.1) + font-awesome-rails (4.7.0.4) + railties (>= 3.2, < 6.0) foreman (0.84.0) thor (~> 0.19.1) formatador (0.2.5) @@ -339,8 +338,8 @@ GEM grape-entity (0.7.1) activesupport (>= 4.0) multi_json (>= 1.3.2) - grape-path-helpers (1.0.6) - activesupport (>= 4, < 5.1) + grape-path-helpers (1.1.0) + activesupport grape (~> 1.0) rake (~> 12) grape_logging (1.7.0) @@ -658,19 +657,19 @@ GEM rack rack-proxy (0.6.0) rack - rack-test (0.6.3) - rack (>= 1.0) - rails (5.0.7.2) - actioncable (= 5.0.7.2) - actionmailer (= 5.0.7.2) - actionpack (= 5.0.7.2) - actionview (= 5.0.7.2) - activejob (= 5.0.7.2) - activemodel (= 5.0.7.2) - activerecord (= 5.0.7.2) - activesupport (= 5.0.7.2) + rack-test (1.1.0) + rack (>= 1.0, < 3) + rails (5.1.6.1) + actioncable (= 5.1.6.1) + actionmailer (= 5.1.6.1) + actionpack (= 5.1.6.1) + actionview (= 5.1.6.1) + activejob (= 5.1.6.1) + activemodel (= 5.1.6.1) + activerecord (= 5.1.6.1) + activesupport (= 5.1.6.1) bundler (>= 1.3.0) - railties (= 5.0.7.2) + railties (= 5.1.6.1) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.2) actionpack (~> 5.x, >= 5.0.1) @@ -1067,7 +1066,7 @@ DEPENDENCIES gpgme (~> 2.0.18) grape (~> 1.1.0) grape-entity (~> 0.7.1) - grape-path-helpers (~> 1.0) + grape-path-helpers (~> 1.1) grape_logging (~> 1.7) graphiql-rails (~> 1.4.10) graphql (~> 1.8.0) @@ -1142,7 +1141,7 @@ DEPENDENCIES rack-cors (~> 1.0.0) rack-oauth2 (~> 1.9.3) rack-proxy (~> 0.6.0) - rails (= 5.0.7.2) + rails (= 5.1.6.1) rails-controller-testing rails-i18n (~> 5.1) rainbow (~> 3.0) diff --git a/app/models/ci/job_artifact.rb b/app/models/ci/job_artifact.rb index 7c836c6f95c..f9cf398556d 100644 --- a/app/models/ci/job_artifact.rb +++ b/app/models/ci/job_artifact.rb @@ -56,7 +56,7 @@ module Ci update_project_statistics stat: :build_artifacts_size - after_save :update_file_store, if: :file_changed? + after_save :update_file_store, if: :saved_change_to_file? scope :with_files_stored_locally, -> { where(file_store: [nil, ::JobArtifactUploader::Store::LOCAL]) } diff --git a/app/models/clusters/platforms/kubernetes.rb b/app/models/clusters/platforms/kubernetes.rb index 2ae141190a8..a806367a49b 100644 --- a/app/models/clusters/platforms/kubernetes.rb +++ b/app/models/clusters/platforms/kubernetes.rb @@ -230,7 +230,7 @@ module Clusters end def update_kubernetes_namespace - return unless namespace_changed? + return unless saved_change_to_namespace? run_after_commit do ClusterConfigureWorker.perform_async(cluster_id) diff --git a/app/models/concerns/storage/legacy_namespace.rb b/app/models/concerns/storage/legacy_namespace.rb index 71a799f44fc..1cbe27ad03a 100644 --- a/app/models/concerns/storage/legacy_namespace.rb +++ b/app/models/concerns/storage/legacy_namespace.rb @@ -13,8 +13,8 @@ module Storage raise Gitlab::UpdatePathError.new("Namespace #{name} (#{id}) cannot be moved because at least one project (e.g. #{proj_with_tags.name} (#{proj_with_tags.id})) has tags in container registry") end - parent_was = if parent_changed? && parent_id_was.present? - Namespace.find(parent_id_was) # raise NotFound early if needed + parent_was = if parent_changed? && parent_id_before_last_save.present? + Namespace.find(parent_id_before_last_save) # raise NotFound early if needed end move_repositories diff --git a/app/models/group.rb b/app/models/group.rb index 8bc9b75f0a9..53331a19776 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -61,7 +61,7 @@ class Group < Namespace after_create :post_create_hook after_destroy :post_destroy_hook after_save :update_two_factor_requirement - after_update :path_changed_hook, if: :path_changed? + after_update :path_changed_hook, if: :saved_change_to_path? class << self def sort_by_attribute(method) @@ -411,7 +411,7 @@ class Group < Namespace private def update_two_factor_requirement - return unless require_two_factor_authentication_changed? || two_factor_grace_period_changed? + return unless saved_change_to_require_two_factor_authentication? || saved_change_to_two_factor_grace_period? users.find_each(&:update_two_factor_requirement) end diff --git a/app/models/lfs_object.rb b/app/models/lfs_object.rb index e1aac691a64..5245dbc8d15 100644 --- a/app/models/lfs_object.rb +++ b/app/models/lfs_object.rb @@ -13,7 +13,7 @@ class LfsObject < ApplicationRecord mount_uploader :file, LfsObjectUploader - after_save :update_file_store, if: :file_changed? + after_save :update_file_store, if: :saved_change_to_file? def update_file_store # The file.object_store is set during `uploader.store!` diff --git a/app/models/members/group_member.rb b/app/models/members/group_member.rb index 510f856087d..b266c61f002 100644 --- a/app/models/members/group_member.rb +++ b/app/models/members/group_member.rb @@ -55,7 +55,7 @@ class GroupMember < Member end def post_update_hook - if access_level_changed? + if saved_change_to_access_level? run_after_commit { notification_service.update_group_member(self) } end diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb index 5372c6084f4..c64e2669b6a 100644 --- a/app/models/members/project_member.rb +++ b/app/models/members/project_member.rb @@ -111,7 +111,7 @@ class ProjectMember < Member end def post_update_hook - if access_level_changed? + if saved_change_to_access_level? run_after_commit { notification_service.update_project_member(self) } end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 251a7ff41f5..a5b62659b24 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -698,7 +698,7 @@ class MergeRequest < ApplicationRecord end def reload_diff_if_branch_changed - if (source_branch_changed? || target_branch_changed?) && + if (saved_change_to_source_branch? || saved_change_to_target_branch?) && (source_branch_head && target_branch_head) reload_diff end diff --git a/app/models/namespace.rb b/app/models/namespace.rb index 8638c5a9c53..7228aab2c2e 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -50,6 +50,8 @@ class Namespace < ApplicationRecord validate :nesting_level_allowed + validates_associated :runners + delegate :name, to: :owner, allow_nil: true, prefix: true delegate :avatar_url, to: :owner, allow_nil: true @@ -57,7 +59,7 @@ class Namespace < ApplicationRecord before_create :sync_share_with_group_lock_with_parent before_update :sync_share_with_group_lock_with_parent, if: :parent_changed? - after_update :force_share_with_group_lock_on_descendants, if: -> { share_with_group_lock_changed? && share_with_group_lock? } + after_update :force_share_with_group_lock_on_descendants, if: -> { saved_change_to_share_with_group_lock? && share_with_group_lock? } # Legacy Storage specific hooks @@ -292,7 +294,7 @@ class Namespace < ApplicationRecord private def path_or_parent_changed? - path_changed? || parent_changed? + saved_change_to_path? || saved_change_to_parent_id? end def refresh_access_of_projects_invited_groups diff --git a/app/models/pages_domain.rb b/app/models/pages_domain.rb index 82901ceec01..d73b2889f30 100644 --- a/app/models/pages_domain.rb +++ b/app/models/pages_domain.rb @@ -147,20 +147,20 @@ class PagesDomain < ApplicationRecord # rubocop: enable CodeReuse/ServiceClass def pages_config_changed? - project_id_changed? || - domain_changed? || - certificate_changed? || - key_changed? || + saved_change_to_project_id? || + saved_change_to_domain? || + saved_change_to_certificate? || + saved_change_to_key? || became_enabled? || became_disabled? end def became_enabled? - enabled_until.present? && !enabled_until_was.present? + enabled_until.present? && !enabled_until_before_last_save.present? end def became_disabled? - !enabled_until.present? && enabled_until_was.present? + !enabled_until.present? && enabled_until_before_last_save.present? end def validate_matching_key diff --git a/app/models/project.rb b/app/models/project.rb index b7a10b3547a..626ff9e1389 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -90,7 +90,7 @@ class Project < ApplicationRecord before_save :ensure_runners_token - after_save :update_project_statistics, if: :namespace_id_changed? + after_save :update_project_statistics, if: :saved_change_to_namespace_id? after_save :create_import_state, if: ->(project) { project.import? && project.import_state.nil? } @@ -116,7 +116,7 @@ class Project < ApplicationRecord after_initialize :use_hashed_storage after_create :check_repository_absence! after_create :ensure_storage_path_exists - after_save :ensure_storage_path_exists, if: :namespace_id_changed? + after_save :ensure_storage_path_exists, if: :saved_change_to_namespace_id? acts_as_ordered_taggable @@ -1430,7 +1430,7 @@ class Project < ApplicationRecord # update visibility_level of forks def update_forks_visibility_level - return unless visibility_level < visibility_level_was + return unless visibility_level < visibility_level_before_last_save forks.each do |forked_project| if forked_project.visibility_level > visibility_level diff --git a/app/models/remote_mirror.rb b/app/models/remote_mirror.rb index b2fd5394a03..535f772b6a1 100644 --- a/app/models/remote_mirror.rb +++ b/app/models/remote_mirror.rb @@ -248,7 +248,7 @@ class RemoteMirror < ApplicationRecord # Before adding a new remote we have to delete the data from # the previous remote name - prev_remote_name = remote_name_was || fallback_remote_name + prev_remote_name = remote_name_before_last_save || fallback_remote_name run_after_commit do project.repository.async_remove_remote(prev_remote_name) end diff --git a/app/models/route.rb b/app/models/route.rb index 7e3db54d4fe..91ea2966013 100644 --- a/app/models/route.rb +++ b/app/models/route.rb @@ -14,26 +14,26 @@ class Route < ApplicationRecord before_validation :delete_conflicting_orphaned_routes after_create :delete_conflicting_redirects - after_update :delete_conflicting_redirects, if: :path_changed? + after_update :delete_conflicting_redirects, if: :saved_change_to_path? after_update :create_redirect_for_old_path after_update :rename_descendants scope :inside_path, -> (path) { where('routes.path LIKE ?', "#{sanitize_sql_like(path)}/%") } def rename_descendants - return unless path_changed? || name_changed? + return unless saved_change_to_path? || saved_change_to_name? - descendant_routes = self.class.inside_path(path_was) + descendant_routes = self.class.inside_path(path_before_last_save) descendant_routes.each do |route| attributes = {} - if path_changed? && route.path.present? - attributes[:path] = route.path.sub(path_was, path) + if saved_change_to_path? && route.path.present? + attributes[:path] = route.path.sub(path_before_last_save, path) end - if name_changed? && name_was.present? && route.name.present? - attributes[:name] = route.name.sub(name_was, name) + if saved_change_to_name? && name_before_last_save.present? && route.name.present? + attributes[:name] = route.name.sub(name_before_last_save, name) end if attributes.present? @@ -65,7 +65,7 @@ class Route < ApplicationRecord private def create_redirect_for_old_path - create_redirect(path_was) if path_changed? + create_redirect(path_before_last_save) if saved_change_to_path? end def delete_conflicting_orphaned_routes diff --git a/app/models/user.rb b/app/models/user.rb index 551eb58a4de..43039f3760e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -194,7 +194,7 @@ class User < ApplicationRecord before_validation :ensure_namespace_correct before_save :ensure_namespace_correct # in case validation is skipped after_validation :set_username_errors - after_update :username_changed_hook, if: :username_changed? + after_update :username_changed_hook, if: :saved_change_to_username? after_destroy :post_destroy_hook after_destroy :remove_key_cache after_commit(on: :update) do diff --git a/app/services/projects/propagate_service_template.rb b/app/services/projects/propagate_service_template.rb index 633a263af7b..a2f36d2bd1b 100644 --- a/app/services/projects/propagate_service_template.rb +++ b/app/services/projects/propagate_service_template.rb @@ -80,7 +80,7 @@ module Projects value = value.is_a?(Hash) ? value.to_json : value service_hash[ActiveRecord::Base.connection.quote_column_name(key)] = - ActiveRecord::Base.sanitize(value) + ActiveRecord::Base.connection.quote(value) end end end diff --git a/changelogs/unreleased/rails5-1.yml b/changelogs/unreleased/rails5-1.yml new file mode 100644 index 00000000000..1dfe3fb2b94 --- /dev/null +++ b/changelogs/unreleased/rails5-1.yml @@ -0,0 +1,5 @@ +--- +title: Rails 5.1 +merge_request: 24852 +author: Jasper Maes +type: other diff --git a/config/application.rb b/config/application.rb index cbcfef34e01..cddd91f267a 100644 --- a/config/application.rb +++ b/config/application.rb @@ -164,9 +164,6 @@ module Gitlab # Version of your assets, change this if you want to expire all your assets config.assets.version = '1.0' - # Can be removed once upgraded to Rails 5.1 or higher - config.action_controller.raise_on_unfiltered_parameters = true - # Nokogiri is significantly faster and uses less memory than REXML ActiveSupport::XmlMini.backend = 'Nokogiri' diff --git a/config/initializers/active_record_attr_mutation_tracker.rb b/config/initializers/active_record_attr_mutation_tracker.rb new file mode 100644 index 00000000000..0fd2ce56f2c --- /dev/null +++ b/config/initializers/active_record_attr_mutation_tracker.rb @@ -0,0 +1,16 @@ +# Remove once https://github.com/rails/rails/pull/32498 +# is released on a 5.1.x rails version. +# Commit on 5-1-stable branch: https://github.com/rails/rails/commit/6ef736625eddf6700f2e67f7849c79c92381abee + +module ActiveRecord + class AttributeMutationTracker + def changes + attr_names.each_with_object({}.with_indifferent_access) do |attr_name, result| + change = change_to_attribute(attr_name) + if change + result.merge!(attr_name => change) + end + end + end + end +end diff --git a/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb b/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb deleted file mode 100644 index 228ced32188..00000000000 --- a/config/initializers/active_record_avoid_type_casting_in_uniqueness_validator.rb +++ /dev/null @@ -1,94 +0,0 @@ -# This is a monkey patch which must be removed when migrating to Rails 5.1 from 5.0. -# -# In Rails 5.0 there was introduced a bug which casts types in the uniqueness validator. -# https://github.com/rails/rails/pull/23523/commits/811a4fa8eb6ceea841e61e8ac05747ffb69595ae -# -# That causes to bugs like this: -# -# 1) API::Users POST /user/:id/gpg_keys/:key_id/revoke when authenticated revokes existing key -# Failure/Error: let(:gpg_key) { create(:gpg_key, user: user) } -# -# TypeError: -# can't cast Hash -# # ./spec/requests/api/users_spec.rb:7:in `block (2 levels) in <top (required)>' -# # ./spec/requests/api/users_spec.rb:908:in `block (4 levels) in <top (required)>' -# # ------------------ -# # --- Caused by: --- -# # TypeError: -# # TypeError -# # ./spec/requests/api/users_spec.rb:7:in `block (2 levels) in <top (required)>' -# -# This bug was fixed in Rails 5.1 by https://github.com/rails/rails/pull/24745/commits/aa062318c451512035c10898a1af95943b1a3803 - -if Rails.gem_version >= Gem::Version.new("5.1") - raise "Remove this monkey patch: #{__FILE__}" -end - -# Copy-paste from https://github.com/kamipo/rails/blob/aa062318c451512035c10898a1af95943b1a3803/activerecord/lib/active_record/validations/uniqueness.rb -# including local fixes to make Rubocop happy again. -module ActiveRecord - module Validations - class UniquenessValidator < ActiveModel::EachValidator # :nodoc: - def validate_each(record, attribute, value) - finder_class = find_finder_class_for(record) - table = finder_class.arel_table - value = map_enum_attribute(finder_class, attribute, value) - - relation = build_relation(finder_class, table, attribute, value) - - if record.persisted? - if finder_class.primary_key - relation = relation.where.not(finder_class.primary_key => record.id_was || record.id) - else - raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.") - end - end - - relation = scope_relation(record, table, relation) - relation = relation.merge(options[:conditions]) if options[:conditions] - - if relation.exists? - error_options = options.except(:case_sensitive, :scope, :conditions) - error_options[:value] = value - - record.errors.add(attribute, :taken, error_options) - end - rescue RangeError - end - - protected - - def build_relation(klass, table, attribute, value) #:nodoc: - if reflection = klass._reflect_on_association(attribute) - attribute = reflection.foreign_key - value = value.attributes[reflection.klass.primary_key] unless value.nil? - end - - # the attribute may be an aliased attribute - if klass.attribute_alias?(attribute) - attribute = klass.attribute_alias(attribute) - end - - attribute_name = attribute.to_s - - column = klass.columns_hash[attribute_name] - cast_type = klass.type_for_attribute(attribute_name) - - comparison = - if !options[:case_sensitive] && !value.nil? - # will use SQL LOWER function before comparison, unless it detects a case insensitive collation - klass.connection.case_insensitive_comparison(table, attribute, column, value) - else - klass.connection.case_sensitive_comparison(table, attribute, column, value) - end - - if value.nil? - klass.unscoped.where(comparison) - else - bind = Relation::QueryAttribute.new(attribute_name, value, cast_type) - klass.unscoped.where(comparison, bind) - end - end - end - end -end diff --git a/config/initializers/active_record_becomes.rb b/config/initializers/active_record_becomes.rb new file mode 100644 index 00000000000..ec4799deeef --- /dev/null +++ b/config/initializers/active_record_becomes.rb @@ -0,0 +1,29 @@ +# rubocop:disable Gitlab/ModuleWithInstanceVariables + +# Remove once https://github.com/rails/rails/issues/32867 +# is released on a 5.1.x rails version. +# Commit on 5-1-stable branch: https://github.com/rails/rails/commit/44f0df3f3980ba3aeca956839e1948b246ff34fe + +module ActiveRecord + module AttributeMethods + module Dirty + def attributes_in_database + mutations_from_database.changed_values + end + end + end + + module Persistence + def becomes(klass) + became = klass.new + became.instance_variable_set("@attributes", @attributes) + became.instance_variable_set("@mutation_tracker", @mutation_tracker ||= nil) + became.instance_variable_set("@mutations_from_database", @mutations_from_database ||= nil) + became.instance_variable_set("@changed_attributes", attributes_changed_by_setter) + became.instance_variable_set("@new_record", new_record?) + became.instance_variable_set("@destroyed", destroyed?) + became.errors.copy!(errors) + became + end + end +end diff --git a/config/initializers/active_record_build_select.rb b/config/initializers/active_record_build_select.rb new file mode 100644 index 00000000000..d072f272e3c --- /dev/null +++ b/config/initializers/active_record_build_select.rb @@ -0,0 +1,22 @@ +# rubocop:disable Gitlab/ModuleWithInstanceVariables + +# build_select only selects the required fields if the model has ignored_columns. +# This is incompatible with some migrations or background migration specs because +# rails keeps a statement cache in memory. So if a model with ignored_columns in a +# migration is used, the query with select table.col1, table.col2 is stored in the +# statement cache. If a different migration is then run and one of these columns is +# removed in the meantime, the query is invalid. + +module ActiveRecord + module QueryMethods + private + + def build_select(arel) + if select_values.any? + arel.project(*arel_columns(select_values.uniq)) + else + arel.project(@klass.arel_table[Arel.star]) + end + end + end +end diff --git a/config/initializers/active_record_locking.rb b/config/initializers/active_record_locking.rb deleted file mode 100644 index 1bd1a12e4b7..00000000000 --- a/config/initializers/active_record_locking.rb +++ /dev/null @@ -1,76 +0,0 @@ -# rubocop:disable Lint/RescueException - -# Remove this monkey patch when we move to Rails 5.1, because the bug has been fixed in https://github.com/rails/rails/pull/26050. -if Rails.gem_version >= Gem::Version.new("5.1") - raise "Remove this monkey patch: #{__FILE__}" -end - -module ActiveRecord - module Locking - module Optimistic - # We overwrite this method because we don't want to have default value - # for newly created records - def _create_record(attribute_names = self.attribute_names, *) # :nodoc: - super - end - - def _update_record(attribute_names = self.attribute_names) #:nodoc: - return super unless locking_enabled? - return 0 if attribute_names.empty? - - lock_col = self.class.locking_column - previous_lock_value = send(lock_col).to_i - increment_lock - - attribute_names += [lock_col] - attribute_names.uniq! - - begin - relation = self.class.unscoped - - affected_rows = relation.where( - self.class.primary_key => id, - # Patched because when `lock_version` is read as `0`, it may actually be `NULL` in the DB. - lock_col => previous_lock_value == 0 ? [nil, 0] : previous_lock_value - ).update_all( - attributes_for_update(attribute_names).map do |name| - [name, _read_attribute(name)] - end.to_h - ) - - unless affected_rows == 1 - raise ActiveRecord::StaleObjectError.new(self, "update") - end - - affected_rows - - # If something went wrong, revert the version. - rescue Exception - send(lock_col + '=', previous_lock_value) - raise - end - end - - # This is patched because we need it to query `lock_version IS NULL` - # rather than `lock_version = 0` whenever lock_version is NULL. - def relation_for_destroy - return super unless locking_enabled? - - column_name = self.class.locking_column - super.where(self.class.arel_table[column_name].eq(self[column_name])) - end - end - - # This is patched because we want `lock_version` default to `NULL` - # rather than `0` - class LockingType - def deserialize(value) - super - end - - def serialize(value) - super - end - end - end -end diff --git a/config/initializers/ar_native_database_types.rb b/config/initializers/ar_native_database_types.rb index 3522b1db536..6d397661f75 100644 --- a/config/initializers/ar_native_database_types.rb +++ b/config/initializers/ar_native_database_types.rb @@ -4,7 +4,8 @@ module ActiveRecord module ConnectionAdapters class AbstractMysqlAdapter NATIVE_DATABASE_TYPES.merge!( - bigserial: { name: 'bigint(20) auto_increment PRIMARY KEY' } + bigserial: { name: 'bigint(20) auto_increment PRIMARY KEY' }, + serial: { name: 'int auto_increment PRIMARY KEY' } ) end end diff --git a/config/initializers/postgresql_opclasses_support.rb b/config/initializers/postgresql_opclasses_support.rb index b066f3788ec..7e912180820 100644 --- a/config/initializers/postgresql_opclasses_support.rb +++ b/config/initializers/postgresql_opclasses_support.rb @@ -78,7 +78,7 @@ module ActiveRecord if index_name.length > max_index_length raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' is too long; the limit is #{max_index_length} characters" end - if data_source_exists?(table_name) && index_name_exists?(table_name, index_name, false) + if data_source_exists?(table_name) && index_name_exists?(table_name, index_name) raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' already exists" end index_columns = quoted_columns_for_index(column_names, options).join(", ") diff --git a/db/migrate/20161031181638_add_unique_index_to_subscriptions.rb b/db/migrate/20161031181638_add_unique_index_to_subscriptions.rb index 23a775d6282..9005b42b41f 100644 --- a/db/migrate/20161031181638_add_unique_index_to_subscriptions.rb +++ b/db/migrate/20161031181638_add_unique_index_to_subscriptions.rb @@ -9,11 +9,11 @@ class AddUniqueIndexToSubscriptions < ActiveRecord::Migration[4.2] def up add_concurrent_index :subscriptions, [:subscribable_id, :subscribable_type, :user_id, :project_id], { unique: true, name: 'index_subscriptions_on_subscribable_and_user_id_and_project_id' } - remove_index :subscriptions, name: 'subscriptions_user_id_and_ref_fields' if index_name_exists?(:subscriptions, 'subscriptions_user_id_and_ref_fields', false) + remove_index :subscriptions, name: 'subscriptions_user_id_and_ref_fields' if index_name_exists?(:subscriptions, 'subscriptions_user_id_and_ref_fields') end def down add_concurrent_index :subscriptions, [:subscribable_id, :subscribable_type, :user_id], { unique: true, name: 'subscriptions_user_id_and_ref_fields' } - remove_index :subscriptions, name: 'index_subscriptions_on_subscribable_and_user_id_and_project_id' if index_name_exists?(:subscriptions, 'index_subscriptions_on_subscribable_and_user_id_and_project_id', false) + remove_index :subscriptions, name: 'index_subscriptions_on_subscribable_and_user_id_and_project_id' if index_name_exists?(:subscriptions, 'index_subscriptions_on_subscribable_and_user_id_and_project_id') end end diff --git a/db/schema.rb b/db/schema.rb index c0399529deb..022ff9c9c2e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -16,7 +16,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do enable_extension "plpgsql" enable_extension "pg_trgm" - create_table "abuse_reports", force: :cascade do |t| + create_table "abuse_reports", id: :serial, force: :cascade do |t| t.integer "reporter_id" t.integer "user_id" t.text "message" @@ -26,7 +26,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.integer "cached_markdown_version" end - create_table "appearances", force: :cascade do |t| + create_table "appearances", id: :serial, force: :cascade do |t| t.string "title", null: false t.text "description", null: false t.string "header_logo" @@ -47,13 +47,13 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.boolean "email_header_and_footer_enabled", default: false, null: false end - create_table "application_setting_terms", force: :cascade do |t| + create_table "application_setting_terms", id: :serial, force: :cascade do |t| t.integer "cached_markdown_version" t.text "terms", null: false t.text "terms_html" end - create_table "application_settings", force: :cascade do |t| + create_table "application_settings", id: :serial, force: :cascade do |t| t.integer "default_projects_limit" t.boolean "signup_enabled" t.boolean "gravatar_enabled" @@ -190,7 +190,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["usage_stats_set_by_user_id"], name: "index_application_settings_on_usage_stats_set_by_user_id", using: :btree end - create_table "audit_events", force: :cascade do |t| + create_table "audit_events", id: :serial, force: :cascade do |t| t.integer "author_id", null: false t.string "type", null: false t.integer "entity_id", null: false @@ -201,7 +201,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["entity_id", "entity_type"], name: "index_audit_events_on_entity_id_and_entity_type", using: :btree end - create_table "award_emoji", force: :cascade do |t| + create_table "award_emoji", id: :serial, force: :cascade do |t| t.string "name" t.integer "user_id" t.integer "awardable_id" @@ -212,7 +212,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id", "name"], name: "index_award_emoji_on_user_id_and_name", using: :btree end - create_table "badges", force: :cascade do |t| + create_table "badges", id: :serial, force: :cascade do |t| t.string "link_url", null: false t.string "image_url", null: false t.integer "project_id" @@ -224,7 +224,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_badges_on_project_id", using: :btree end - create_table "board_group_recent_visits", id: :bigserial, force: :cascade do |t| + create_table "board_group_recent_visits", force: :cascade do |t| t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.integer "user_id" @@ -236,7 +236,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_board_group_recent_visits_on_user_id", using: :btree end - create_table "board_project_recent_visits", id: :bigserial, force: :cascade do |t| + create_table "board_project_recent_visits", force: :cascade do |t| t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.integer "user_id" @@ -248,7 +248,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_board_project_recent_visits_on_user_id", using: :btree end - create_table "boards", force: :cascade do |t| + create_table "boards", id: :serial, force: :cascade do |t| t.integer "project_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false @@ -257,7 +257,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_boards_on_project_id", using: :btree end - create_table "broadcast_messages", force: :cascade do |t| + create_table "broadcast_messages", id: :serial, force: :cascade do |t| t.text "message", null: false t.datetime "starts_at", null: false t.datetime "ends_at", null: false @@ -270,7 +270,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["starts_at", "ends_at", "id"], name: "index_broadcast_messages_on_starts_at_and_ends_at_and_id", using: :btree end - create_table "chat_names", force: :cascade do |t| + create_table "chat_names", id: :serial, force: :cascade do |t| t.integer "user_id", null: false t.integer "service_id", null: false t.string "team_id", null: false @@ -284,7 +284,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id", "service_id"], name: "index_chat_names_on_user_id_and_service_id", unique: true, using: :btree end - create_table "chat_teams", force: :cascade do |t| + create_table "chat_teams", id: :serial, force: :cascade do |t| t.integer "namespace_id", null: false t.string "team_id" t.string "name" @@ -293,7 +293,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["namespace_id"], name: "index_chat_teams_on_namespace_id", unique: true, using: :btree end - create_table "ci_build_trace_chunks", id: :bigserial, force: :cascade do |t| + create_table "ci_build_trace_chunks", force: :cascade do |t| t.integer "build_id", null: false t.integer "chunk_index", null: false t.integer "data_store", null: false @@ -301,13 +301,13 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["build_id", "chunk_index"], name: "index_ci_build_trace_chunks_on_build_id_and_chunk_index", unique: true, using: :btree end - create_table "ci_build_trace_section_names", force: :cascade do |t| + create_table "ci_build_trace_section_names", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.string "name", null: false t.index ["project_id", "name"], name: "index_ci_build_trace_section_names_on_project_id_and_name", unique: true, using: :btree end - create_table "ci_build_trace_sections", force: :cascade do |t| + create_table "ci_build_trace_sections", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.datetime_with_timezone "date_start", null: false t.datetime_with_timezone "date_end", null: false @@ -320,7 +320,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["section_name_id"], name: "index_ci_build_trace_sections_on_section_name_id", using: :btree end - create_table "ci_builds", force: :cascade do |t| + create_table "ci_builds", id: :serial, force: :cascade do |t| t.string "status" t.datetime "finished_at" t.text "trace" @@ -387,7 +387,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_ci_builds_on_user_id", using: :btree end - create_table "ci_builds_metadata", force: :cascade do |t| + create_table "ci_builds_metadata", id: :serial, force: :cascade do |t| t.integer "build_id", null: false t.integer "project_id", null: false t.integer "timeout" @@ -398,7 +398,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_ci_builds_metadata_on_project_id", using: :btree end - create_table "ci_builds_runner_session", id: :bigserial, force: :cascade do |t| + create_table "ci_builds_runner_session", force: :cascade do |t| t.integer "build_id", null: false t.string "url", null: false t.string "certificate" @@ -406,7 +406,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["build_id"], name: "index_ci_builds_runner_session_on_build_id", unique: true, using: :btree end - create_table "ci_group_variables", force: :cascade do |t| + create_table "ci_group_variables", id: :serial, force: :cascade do |t| t.string "key", null: false t.text "value" t.text "encrypted_value" @@ -420,7 +420,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["group_id", "key"], name: "index_ci_group_variables_on_group_id_and_key", unique: true, using: :btree end - create_table "ci_job_artifacts", force: :cascade do |t| + create_table "ci_job_artifacts", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "job_id", null: false t.integer "file_type", null: false @@ -439,7 +439,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_ci_job_artifacts_on_project_id", using: :btree end - create_table "ci_pipeline_chat_data", id: :bigserial, force: :cascade do |t| + create_table "ci_pipeline_chat_data", force: :cascade do |t| t.integer "pipeline_id", null: false t.integer "chat_name_id", null: false t.text "response_url", null: false @@ -459,7 +459,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["pipeline_schedule_id", "key"], name: "index_ci_pipeline_schedule_variables_on_schedule_id_and_key", unique: true, using: :btree end - create_table "ci_pipeline_schedules", force: :cascade do |t| + create_table "ci_pipeline_schedules", id: :serial, force: :cascade do |t| t.string "description" t.string "ref" t.string "cron" @@ -475,7 +475,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_ci_pipeline_schedules_on_project_id", using: :btree end - create_table "ci_pipeline_variables", force: :cascade do |t| + create_table "ci_pipeline_variables", id: :serial, force: :cascade do |t| t.string "key", null: false t.text "value" t.text "encrypted_value" @@ -485,7 +485,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["pipeline_id", "key"], name: "index_ci_pipeline_variables_on_pipeline_id_and_key", unique: true, using: :btree end - create_table "ci_pipelines", force: :cascade do |t| + create_table "ci_pipelines", id: :serial, force: :cascade do |t| t.string "ref" t.string "sha" t.string "before_sha" @@ -525,14 +525,14 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_ci_pipelines_on_user_id", using: :btree end - create_table "ci_runner_namespaces", force: :cascade do |t| + create_table "ci_runner_namespaces", id: :serial, force: :cascade do |t| t.integer "runner_id" t.integer "namespace_id" t.index ["namespace_id"], name: "index_ci_runner_namespaces_on_namespace_id", using: :btree t.index ["runner_id", "namespace_id"], name: "index_ci_runner_namespaces_on_runner_id_and_namespace_id", unique: true, using: :btree end - create_table "ci_runner_projects", force: :cascade do |t| + create_table "ci_runner_projects", id: :serial, force: :cascade do |t| t.integer "runner_id", null: false t.datetime "created_at" t.datetime "updated_at" @@ -541,7 +541,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["runner_id"], name: "index_ci_runner_projects_on_runner_id", using: :btree end - create_table "ci_runners", force: :cascade do |t| + create_table "ci_runners", id: :serial, force: :cascade do |t| t.string "token" t.datetime "created_at" t.datetime "updated_at" @@ -569,7 +569,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["token_encrypted"], name: "index_ci_runners_on_token_encrypted", using: :btree end - create_table "ci_stages", force: :cascade do |t| + create_table "ci_stages", id: :serial, force: :cascade do |t| t.integer "project_id" t.integer "pipeline_id" t.datetime "created_at" @@ -584,7 +584,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_ci_stages_on_project_id", using: :btree end - create_table "ci_trigger_requests", force: :cascade do |t| + create_table "ci_trigger_requests", id: :serial, force: :cascade do |t| t.integer "trigger_id", null: false t.text "variables" t.datetime "created_at" @@ -594,7 +594,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["trigger_id"], name: "index_ci_trigger_requests_on_trigger_id", using: :btree end - create_table "ci_triggers", force: :cascade do |t| + create_table "ci_triggers", id: :serial, force: :cascade do |t| t.string "token" t.datetime "created_at" t.datetime "updated_at" @@ -606,7 +606,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_ci_triggers_on_project_id", using: :btree end - create_table "ci_variables", force: :cascade do |t| + create_table "ci_variables", id: :serial, force: :cascade do |t| t.string "key", null: false t.text "value" t.text "encrypted_value" @@ -619,14 +619,14 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id", "key", "environment_scope"], name: "index_ci_variables_on_project_id_and_key_and_environment_scope", unique: true, using: :btree end - create_table "cluster_groups", force: :cascade do |t| + create_table "cluster_groups", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.integer "group_id", null: false t.index ["cluster_id", "group_id"], name: "index_cluster_groups_on_cluster_id_and_group_id", unique: true, using: :btree t.index ["group_id"], name: "index_cluster_groups_on_group_id", using: :btree end - create_table "cluster_platforms_kubernetes", force: :cascade do |t| + create_table "cluster_platforms_kubernetes", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false @@ -642,7 +642,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["cluster_id"], name: "index_cluster_platforms_kubernetes_on_cluster_id", unique: true, using: :btree end - create_table "cluster_projects", force: :cascade do |t| + create_table "cluster_projects", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "cluster_id", null: false t.datetime_with_timezone "created_at", null: false @@ -651,7 +651,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_cluster_projects_on_project_id", using: :btree end - create_table "cluster_providers_gcp", force: :cascade do |t| + create_table "cluster_providers_gcp", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.integer "status" t.integer "num_nodes", null: false @@ -669,7 +669,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["cluster_id"], name: "index_cluster_providers_gcp_on_cluster_id", unique: true, using: :btree end - create_table "clusters", force: :cascade do |t| + create_table "clusters", id: :serial, force: :cascade do |t| t.integer "user_id" t.integer "provider_type" t.integer "platform_type" @@ -685,7 +685,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_clusters_on_user_id", using: :btree end - create_table "clusters_applications_cert_managers", force: :cascade do |t| + create_table "clusters_applications_cert_managers", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.integer "status", null: false t.string "version", null: false @@ -696,7 +696,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["cluster_id"], name: "index_clusters_applications_cert_managers_on_cluster_id", unique: true, using: :btree end - create_table "clusters_applications_helm", force: :cascade do |t| + create_table "clusters_applications_helm", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false @@ -709,7 +709,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["cluster_id"], name: "index_clusters_applications_helm_on_cluster_id", unique: true, using: :btree end - create_table "clusters_applications_ingress", force: :cascade do |t| + create_table "clusters_applications_ingress", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false @@ -723,7 +723,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["cluster_id"], name: "index_clusters_applications_ingress_on_cluster_id", unique: true, using: :btree end - create_table "clusters_applications_jupyter", force: :cascade do |t| + create_table "clusters_applications_jupyter", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.integer "oauth_application_id" t.integer "status", null: false @@ -736,7 +736,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["oauth_application_id"], name: "index_clusters_applications_jupyter_on_oauth_application_id", using: :btree end - create_table "clusters_applications_knative", force: :cascade do |t| + create_table "clusters_applications_knative", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false @@ -749,7 +749,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["cluster_id"], name: "index_clusters_applications_knative_on_cluster_id", unique: true, using: :btree end - create_table "clusters_applications_prometheus", force: :cascade do |t| + create_table "clusters_applications_prometheus", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.integer "status", null: false t.string "version", null: false @@ -759,7 +759,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["cluster_id"], name: "index_clusters_applications_prometheus_on_cluster_id", unique: true, using: :btree end - create_table "clusters_applications_runners", force: :cascade do |t| + create_table "clusters_applications_runners", id: :serial, force: :cascade do |t| t.integer "cluster_id", null: false t.integer "runner_id" t.integer "status", null: false @@ -772,7 +772,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["runner_id"], name: "index_clusters_applications_runners_on_runner_id", using: :btree end - create_table "clusters_kubernetes_namespaces", id: :bigserial, force: :cascade do |t| + create_table "clusters_kubernetes_namespaces", force: :cascade do |t| t.integer "cluster_id", null: false t.integer "project_id" t.integer "cluster_project_id" @@ -788,7 +788,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_clusters_kubernetes_namespaces_on_project_id", using: :btree end - create_table "container_repositories", force: :cascade do |t| + create_table "container_repositories", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.string "name", null: false t.datetime "created_at", null: false @@ -797,7 +797,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_container_repositories_on_project_id", using: :btree end - create_table "conversational_development_index_metrics", force: :cascade do |t| + create_table "conversational_development_index_metrics", id: :serial, force: :cascade do |t| t.float "leader_issues", null: false t.float "instance_issues", null: false t.float "leader_notes", null: false @@ -832,7 +832,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.float "percentage_service_desk_issues", default: 0.0, null: false end - create_table "deploy_keys_projects", force: :cascade do |t| + create_table "deploy_keys_projects", id: :serial, force: :cascade do |t| t.integer "deploy_key_id", null: false t.integer "project_id", null: false t.datetime "created_at" @@ -841,7 +841,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_deploy_keys_projects_on_project_id", using: :btree end - create_table "deploy_tokens", force: :cascade do |t| + create_table "deploy_tokens", id: :serial, force: :cascade do |t| t.boolean "revoked", default: false t.boolean "read_repository", default: false, null: false t.boolean "read_registry", default: false, null: false @@ -853,7 +853,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["token"], name: "index_deploy_tokens_on_token", unique: true, using: :btree end - create_table "deployments", force: :cascade do |t| + create_table "deployments", id: :serial, force: :cascade do |t| t.integer "iid", null: false t.integer "project_id", null: false t.integer "environment_id", null: false @@ -879,7 +879,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id", "status"], name: "index_deployments_on_project_id_and_status", using: :btree end - create_table "emails", force: :cascade do |t| + create_table "emails", id: :serial, force: :cascade do |t| t.integer "user_id", null: false t.string "email", null: false t.datetime "created_at" @@ -892,7 +892,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_emails_on_user_id", using: :btree end - create_table "environments", force: :cascade do |t| + create_table "environments", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.string "name", null: false t.datetime "created_at" @@ -905,7 +905,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id", "slug"], name: "index_environments_on_project_id_and_slug", unique: true, using: :btree end - create_table "events", force: :cascade do |t| + create_table "events", id: :serial, force: :cascade do |t| t.integer "project_id" t.integer "author_id", null: false t.integer "target_id" @@ -920,7 +920,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["target_type", "target_id"], name: "index_events_on_target_type_and_target_id", using: :btree end - create_table "feature_gates", force: :cascade do |t| + create_table "feature_gates", id: :serial, force: :cascade do |t| t.string "feature_key", null: false t.string "key", null: false t.string "value" @@ -929,14 +929,14 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["feature_key", "key", "value"], name: "index_feature_gates_on_feature_key_and_key_and_value", unique: true, using: :btree end - create_table "features", force: :cascade do |t| + create_table "features", id: :serial, force: :cascade do |t| t.string "key", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["key"], name: "index_features_on_key", unique: true, using: :btree end - create_table "fork_network_members", force: :cascade do |t| + create_table "fork_network_members", id: :serial, force: :cascade do |t| t.integer "fork_network_id", null: false t.integer "project_id", null: false t.integer "forked_from_project_id" @@ -945,13 +945,13 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_fork_network_members_on_project_id", unique: true, using: :btree end - create_table "fork_networks", force: :cascade do |t| + create_table "fork_networks", id: :serial, force: :cascade do |t| t.integer "root_project_id" t.string "deleted_root_project_name" t.index ["root_project_id"], name: "index_fork_networks_on_root_project_id", unique: true, using: :btree end - create_table "forked_project_links", force: :cascade do |t| + create_table "forked_project_links", id: :serial, force: :cascade do |t| t.integer "forked_to_project_id", null: false t.integer "forked_from_project_id", null: false t.datetime "created_at" @@ -959,7 +959,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree end - create_table "gpg_key_subkeys", force: :cascade do |t| + create_table "gpg_key_subkeys", id: :serial, force: :cascade do |t| t.integer "gpg_key_id", null: false t.binary "keyid" t.binary "fingerprint" @@ -968,7 +968,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["keyid"], name: "index_gpg_key_subkeys_on_keyid", unique: true, using: :btree end - create_table "gpg_keys", force: :cascade do |t| + create_table "gpg_keys", id: :serial, force: :cascade do |t| t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.integer "user_id" @@ -980,7 +980,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_gpg_keys_on_user_id", using: :btree end - create_table "gpg_signatures", force: :cascade do |t| + create_table "gpg_signatures", id: :serial, force: :cascade do |t| t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.integer "project_id" @@ -998,7 +998,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_gpg_signatures_on_project_id", using: :btree end - create_table "group_custom_attributes", force: :cascade do |t| + create_table "group_custom_attributes", id: :serial, force: :cascade do |t| t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.integer "group_id", null: false @@ -1008,7 +1008,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["key", "value"], name: "index_group_custom_attributes_on_key_and_value", using: :btree end - create_table "identities", force: :cascade do |t| + create_table "identities", id: :serial, force: :cascade do |t| t.string "extern_uid" t.string "provider" t.integer "user_id" @@ -1017,7 +1017,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_identities_on_user_id", using: :btree end - create_table "import_export_uploads", force: :cascade do |t| + create_table "import_export_uploads", id: :serial, force: :cascade do |t| t.datetime_with_timezone "updated_at", null: false t.integer "project_id" t.text "import_file" @@ -1026,7 +1026,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["updated_at"], name: "index_import_export_uploads_on_updated_at", using: :btree end - create_table "internal_ids", id: :bigserial, force: :cascade do |t| + create_table "internal_ids", force: :cascade do |t| t.integer "project_id" t.integer "usage", null: false t.integer "last_value", null: false @@ -1044,7 +1044,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_issue_assignees_on_user_id", using: :btree end - create_table "issue_metrics", force: :cascade do |t| + create_table "issue_metrics", id: :serial, force: :cascade do |t| t.integer "issue_id", null: false t.datetime "first_mentioned_in_commit_at" t.datetime "first_associated_with_milestone_at" @@ -1054,7 +1054,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["issue_id"], name: "index_issue_metrics", using: :btree end - create_table "issues", force: :cascade do |t| + create_table "issues", id: :serial, force: :cascade do |t| t.string "title" t.integer "author_id" t.integer "project_id" @@ -1097,7 +1097,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["updated_by_id"], name: "index_issues_on_updated_by_id", where: "(updated_by_id IS NOT NULL)", using: :btree end - create_table "keys", force: :cascade do |t| + create_table "keys", id: :serial, force: :cascade do |t| t.integer "user_id" t.datetime "created_at" t.datetime "updated_at" @@ -1111,7 +1111,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_keys_on_user_id", using: :btree end - create_table "label_links", force: :cascade do |t| + create_table "label_links", id: :serial, force: :cascade do |t| t.integer "label_id" t.integer "target_id" t.string "target_type" @@ -1121,7 +1121,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["target_id", "target_type"], name: "index_label_links_on_target_id_and_target_type", using: :btree end - create_table "label_priorities", force: :cascade do |t| + create_table "label_priorities", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "label_id", null: false t.integer "priority", null: false @@ -1132,7 +1132,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id", "label_id"], name: "index_label_priorities_on_project_id_and_label_id", unique: true, using: :btree end - create_table "labels", force: :cascade do |t| + create_table "labels", id: :serial, force: :cascade do |t| t.string "title" t.string "color" t.integer "project_id" @@ -1151,7 +1151,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["type", "project_id"], name: "index_labels_on_type_and_project_id", using: :btree end - create_table "lfs_file_locks", force: :cascade do |t| + create_table "lfs_file_locks", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "user_id", null: false t.datetime "created_at", null: false @@ -1160,7 +1160,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_lfs_file_locks_on_user_id", using: :btree end - create_table "lfs_objects", force: :cascade do |t| + create_table "lfs_objects", id: :serial, force: :cascade do |t| t.string "oid", null: false t.bigint "size", null: false t.datetime "created_at" @@ -1171,7 +1171,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["oid"], name: "index_lfs_objects_on_oid", unique: true, using: :btree end - create_table "lfs_objects_projects", force: :cascade do |t| + create_table "lfs_objects_projects", id: :serial, force: :cascade do |t| t.integer "lfs_object_id", null: false t.integer "project_id", null: false t.datetime "created_at" @@ -1179,7 +1179,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_lfs_objects_projects_on_project_id", using: :btree end - create_table "lists", force: :cascade do |t| + create_table "lists", id: :serial, force: :cascade do |t| t.integer "board_id", null: false t.integer "label_id" t.integer "list_type", default: 1, null: false @@ -1191,7 +1191,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["list_type"], name: "index_lists_on_list_type", using: :btree end - create_table "members", force: :cascade do |t| + create_table "members", id: :serial, force: :cascade do |t| t.integer "access_level", null: false t.integer "source_id", null: false t.string "source_type", null: false @@ -1254,7 +1254,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["merge_request_diff_id", "relative_order"], name: "index_merge_request_diff_files_on_mr_diff_id_and_order", unique: true, using: :btree end - create_table "merge_request_diffs", force: :cascade do |t| + create_table "merge_request_diffs", id: :serial, force: :cascade do |t| t.string "state" t.integer "merge_request_id", null: false t.datetime "created_at" @@ -1271,7 +1271,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["merge_request_id", "id"], name: "index_merge_request_diffs_on_merge_request_id_and_id_partial", where: "((NOT stored_externally) OR (stored_externally IS NULL))", using: :btree end - create_table "merge_request_metrics", force: :cascade do |t| + create_table "merge_request_metrics", id: :serial, force: :cascade do |t| t.integer "merge_request_id", null: false t.datetime "latest_build_started_at" t.datetime "latest_build_finished_at" @@ -1292,7 +1292,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["pipeline_id"], name: "index_merge_request_metrics_on_pipeline_id", using: :btree end - create_table "merge_requests", force: :cascade do |t| + create_table "merge_requests", id: :serial, force: :cascade do |t| t.string "target_branch", null: false t.string "source_branch", null: false t.integer "source_project_id" @@ -1350,7 +1350,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["updated_by_id"], name: "index_merge_requests_on_updated_by_id", where: "(updated_by_id IS NOT NULL)", using: :btree end - create_table "merge_requests_closing_issues", force: :cascade do |t| + create_table "merge_requests_closing_issues", id: :serial, force: :cascade do |t| t.integer "merge_request_id", null: false t.integer "issue_id", null: false t.datetime "created_at", null: false @@ -1359,7 +1359,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["merge_request_id"], name: "index_merge_requests_closing_issues_on_merge_request_id", using: :btree end - create_table "milestones", force: :cascade do |t| + create_table "milestones", id: :serial, force: :cascade do |t| t.string "title", null: false t.integer "project_id" t.text "description" @@ -1381,7 +1381,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["title"], name: "index_milestones_on_title_trigram", using: :gin, opclasses: {"title"=>"gin_trgm_ops"} end - create_table "namespaces", force: :cascade do |t| + create_table "namespaces", id: :serial, force: :cascade do |t| t.string "name", null: false t.string "path", null: false t.integer "owner_id" @@ -1416,7 +1416,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["type"], name: "index_namespaces_on_type", using: :btree end - create_table "note_diff_files", force: :cascade do |t| + create_table "note_diff_files", id: :serial, force: :cascade do |t| t.integer "diff_note_id", null: false t.text "diff", null: false t.boolean "new_file", null: false @@ -1429,7 +1429,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["diff_note_id"], name: "index_note_diff_files_on_diff_note_id", unique: true, using: :btree end - create_table "notes", force: :cascade do |t| + create_table "notes", id: :serial, force: :cascade do |t| t.text "note" t.string "noteable_type" t.integer "author_id" @@ -1464,7 +1464,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id", "noteable_type"], name: "index_notes_on_project_id_and_noteable_type", using: :btree end - create_table "notification_settings", force: :cascade do |t| + create_table "notification_settings", id: :serial, force: :cascade do |t| t.integer "user_id", null: false t.integer "source_id" t.string "source_type" @@ -1490,7 +1490,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_notification_settings_on_user_id", using: :btree end - create_table "oauth_access_grants", force: :cascade do |t| + create_table "oauth_access_grants", id: :serial, force: :cascade do |t| t.integer "resource_owner_id", null: false t.integer "application_id", null: false t.string "token", null: false @@ -1502,7 +1502,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["token"], name: "index_oauth_access_grants_on_token", unique: true, using: :btree end - create_table "oauth_access_tokens", force: :cascade do |t| + create_table "oauth_access_tokens", id: :serial, force: :cascade do |t| t.integer "resource_owner_id" t.integer "application_id" t.string "token", null: false @@ -1516,7 +1516,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["token"], name: "index_oauth_access_tokens_on_token", unique: true, using: :btree end - create_table "oauth_applications", force: :cascade do |t| + create_table "oauth_applications", id: :serial, force: :cascade do |t| t.string "name", null: false t.string "uid", null: false t.string "secret", null: false @@ -1531,13 +1531,13 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true, using: :btree end - create_table "oauth_openid_requests", force: :cascade do |t| + create_table "oauth_openid_requests", id: :serial, force: :cascade do |t| t.integer "access_grant_id", null: false t.string "nonce", null: false t.index ["access_grant_id"], name: "index_oauth_openid_requests_on_access_grant_id", using: :btree end - create_table "pages_domains", force: :cascade do |t| + create_table "pages_domains", id: :serial, force: :cascade do |t| t.integer "project_id" t.text "certificate" t.text "encrypted_key" @@ -1556,7 +1556,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["verified_at"], name: "index_pages_domains_on_verified_at", using: :btree end - create_table "personal_access_tokens", force: :cascade do |t| + create_table "personal_access_tokens", id: :serial, force: :cascade do |t| t.integer "user_id", null: false t.string "name", null: false t.boolean "revoked", default: false @@ -1570,7 +1570,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_personal_access_tokens_on_user_id", using: :btree end - create_table "pool_repositories", id: :bigserial, force: :cascade do |t| + create_table "pool_repositories", force: :cascade do |t| t.integer "shard_id", null: false t.string "disk_path" t.string "state" @@ -1580,7 +1580,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["source_project_id"], name: "index_pool_repositories_on_source_project_id", unique: true, using: :btree end - create_table "programming_languages", force: :cascade do |t| + create_table "programming_languages", id: :serial, force: :cascade do |t| t.string "name", null: false t.string "color", null: false t.datetime_with_timezone "created_at", null: false @@ -1595,7 +1595,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id", "project_id", "access_level"], name: "index_project_authorizations_on_user_id_project_id_access_level", unique: true, using: :btree end - create_table "project_auto_devops", force: :cascade do |t| + create_table "project_auto_devops", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false @@ -1605,14 +1605,14 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_project_auto_devops_on_project_id", unique: true, using: :btree end - create_table "project_ci_cd_settings", force: :cascade do |t| + create_table "project_ci_cd_settings", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.boolean "group_runners_enabled", default: true, null: false t.boolean "merge_pipelines_enabled" t.index ["project_id"], name: "index_project_ci_cd_settings_on_project_id", unique: true, using: :btree end - create_table "project_custom_attributes", force: :cascade do |t| + create_table "project_custom_attributes", id: :serial, force: :cascade do |t| t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.integer "project_id", null: false @@ -1622,14 +1622,14 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id", "key"], name: "index_project_custom_attributes_on_project_id_and_key", unique: true, using: :btree end - create_table "project_daily_statistics", id: :bigserial, force: :cascade do |t| + create_table "project_daily_statistics", force: :cascade do |t| t.integer "project_id", null: false t.integer "fetch_count", null: false t.date "date" t.index ["project_id", "date"], name: "index_project_daily_statistics_on_project_id_and_date", unique: true, order: { date: :desc }, using: :btree end - create_table "project_deploy_tokens", force: :cascade do |t| + create_table "project_deploy_tokens", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "deploy_token_id", null: false t.datetime_with_timezone "created_at", null: false @@ -1637,7 +1637,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id", "deploy_token_id"], name: "index_project_deploy_tokens_on_project_id_and_deploy_token_id", unique: true, using: :btree end - create_table "project_error_tracking_settings", primary_key: "project_id", id: :integer, force: :cascade do |t| + create_table "project_error_tracking_settings", primary_key: "project_id", id: :integer, default: nil, force: :cascade do |t| t.boolean "enabled", default: false, null: false t.string "api_url" t.string "encrypted_token" @@ -1646,7 +1646,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.string "organization_name" end - create_table "project_features", force: :cascade do |t| + create_table "project_features", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "merge_requests_access_level" t.integer "issues_access_level" @@ -1660,7 +1660,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_project_features_on_project_id", unique: true, using: :btree end - create_table "project_group_links", force: :cascade do |t| + create_table "project_group_links", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "group_id", null: false t.datetime "created_at" @@ -1671,7 +1671,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_project_group_links_on_project_id", using: :btree end - create_table "project_import_data", force: :cascade do |t| + create_table "project_import_data", id: :serial, force: :cascade do |t| t.integer "project_id" t.text "data" t.text "encrypted_credentials" @@ -1680,7 +1680,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_project_import_data_on_project_id", using: :btree end - create_table "project_mirror_data", force: :cascade do |t| + create_table "project_mirror_data", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.string "status" t.string "jid" @@ -1690,7 +1690,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["status"], name: "index_project_mirror_data_on_status", using: :btree end - create_table "project_repositories", id: :bigserial, force: :cascade do |t| + create_table "project_repositories", force: :cascade do |t| t.integer "shard_id", null: false t.string "disk_path", null: false t.integer "project_id", null: false @@ -1699,7 +1699,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["shard_id"], name: "index_project_repositories_on_shard_id", using: :btree end - create_table "project_statistics", force: :cascade do |t| + create_table "project_statistics", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "namespace_id", null: false t.bigint "commit_count", default: 0, null: false @@ -1711,7 +1711,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_project_statistics_on_project_id", unique: true, using: :btree end - create_table "projects", force: :cascade do |t| + create_table "projects", id: :serial, force: :cascade do |t| t.string "name" t.string "path" t.text "description" @@ -1791,7 +1791,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["visibility_level"], name: "index_projects_on_visibility_level", using: :btree end - create_table "prometheus_metrics", force: :cascade do |t| + create_table "prometheus_metrics", id: :serial, force: :cascade do |t| t.integer "project_id" t.string "title", null: false t.string "query", null: false @@ -1809,7 +1809,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_prometheus_metrics_on_project_id", using: :btree end - create_table "protected_branch_merge_access_levels", force: :cascade do |t| + create_table "protected_branch_merge_access_levels", id: :serial, force: :cascade do |t| t.integer "protected_branch_id", null: false t.integer "access_level", default: 40, null: false t.datetime "created_at", null: false @@ -1817,7 +1817,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["protected_branch_id"], name: "index_protected_branch_merge_access", using: :btree end - create_table "protected_branch_push_access_levels", force: :cascade do |t| + create_table "protected_branch_push_access_levels", id: :serial, force: :cascade do |t| t.integer "protected_branch_id", null: false t.integer "access_level", default: 40, null: false t.datetime "created_at", null: false @@ -1825,7 +1825,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["protected_branch_id"], name: "index_protected_branch_push_access", using: :btree end - create_table "protected_branches", force: :cascade do |t| + create_table "protected_branches", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.string "name", null: false t.datetime "created_at" @@ -1833,7 +1833,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_protected_branches_on_project_id", using: :btree end - create_table "protected_tag_create_access_levels", force: :cascade do |t| + create_table "protected_tag_create_access_levels", id: :serial, force: :cascade do |t| t.integer "protected_tag_id", null: false t.integer "access_level", default: 40 t.integer "user_id" @@ -1845,7 +1845,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_protected_tag_create_access_levels_on_user_id", using: :btree end - create_table "protected_tags", force: :cascade do |t| + create_table "protected_tags", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.string "name", null: false t.datetime "created_at", null: false @@ -1866,7 +1866,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["event_id"], name: "index_push_event_payloads_on_event_id", unique: true, using: :btree end - create_table "redirect_routes", force: :cascade do |t| + create_table "redirect_routes", id: :serial, force: :cascade do |t| t.integer "source_id", null: false t.string "source_type", null: false t.string "path", null: false @@ -1876,7 +1876,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["source_type", "source_id"], name: "index_redirect_routes_on_source_type_and_source_id", using: :btree end - create_table "release_links", id: :bigserial, force: :cascade do |t| + create_table "release_links", force: :cascade do |t| t.integer "release_id", null: false t.string "url", null: false t.string "name", null: false @@ -1886,7 +1886,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["release_id", "url"], name: "index_release_links_on_release_id_and_url", unique: true, using: :btree end - create_table "releases", force: :cascade do |t| + create_table "releases", id: :serial, force: :cascade do |t| t.string "tag" t.text "description" t.integer "project_id" @@ -1902,7 +1902,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id"], name: "index_releases_on_project_id", using: :btree end - create_table "remote_mirrors", force: :cascade do |t| + create_table "remote_mirrors", id: :serial, force: :cascade do |t| t.integer "project_id" t.string "url" t.boolean "enabled", default: false @@ -1930,7 +1930,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["project_id", "programming_language_id"], name: "index_repository_languages_on_project_and_languages_id", unique: true, using: :btree end - create_table "resource_label_events", id: :bigserial, force: :cascade do |t| + create_table "resource_label_events", force: :cascade do |t| t.integer "action", null: false t.integer "issue_id" t.integer "merge_request_id" @@ -1946,7 +1946,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_resource_label_events_on_user_id", using: :btree end - create_table "routes", force: :cascade do |t| + create_table "routes", id: :serial, force: :cascade do |t| t.integer "source_id", null: false t.string "source_type", null: false t.string "path", null: false @@ -1958,7 +1958,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["source_type", "source_id"], name: "index_routes_on_source_type_and_source_id", unique: true, using: :btree end - create_table "sent_notifications", force: :cascade do |t| + create_table "sent_notifications", id: :serial, force: :cascade do |t| t.integer "project_id" t.integer "noteable_id" t.string "noteable_type" @@ -1972,7 +1972,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["reply_key"], name: "index_sent_notifications_on_reply_key", unique: true, using: :btree end - create_table "services", force: :cascade do |t| + create_table "services", id: :serial, force: :cascade do |t| t.string "type" t.string "title" t.integer "project_id" @@ -1999,12 +1999,12 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["type"], name: "index_services_on_type", using: :btree end - create_table "shards", force: :cascade do |t| + create_table "shards", id: :serial, force: :cascade do |t| t.string "name", null: false t.index ["name"], name: "index_shards_on_name", unique: true, using: :btree end - create_table "snippets", force: :cascade do |t| + create_table "snippets", id: :serial, force: :cascade do |t| t.string "title" t.text "content" t.integer "author_id", null: false @@ -2027,7 +2027,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["visibility_level"], name: "index_snippets_on_visibility_level", using: :btree end - create_table "spam_logs", force: :cascade do |t| + create_table "spam_logs", id: :serial, force: :cascade do |t| t.integer "user_id" t.string "source_ip" t.string "user_agent" @@ -2041,7 +2041,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.boolean "recaptcha_verified", default: false, null: false end - create_table "subscriptions", force: :cascade do |t| + create_table "subscriptions", id: :serial, force: :cascade do |t| t.integer "user_id" t.integer "subscribable_id" t.string "subscribable_type" @@ -2053,7 +2053,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["subscribable_id", "subscribable_type", "user_id", "project_id"], name: "index_subscriptions_on_subscribable_and_user_id_and_project_id", unique: true, using: :btree end - create_table "suggestions", id: :bigserial, force: :cascade do |t| + create_table "suggestions", force: :cascade do |t| t.integer "note_id", null: false t.integer "relative_order", limit: 2, null: false t.boolean "applied", default: false, null: false @@ -2066,7 +2066,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["note_id", "relative_order"], name: "index_suggestions_on_note_id_and_relative_order", unique: true, using: :btree end - create_table "system_note_metadata", force: :cascade do |t| + create_table "system_note_metadata", id: :serial, force: :cascade do |t| t.integer "note_id", null: false t.integer "commit_count" t.string "action" @@ -2075,7 +2075,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["note_id"], name: "index_system_note_metadata_on_note_id", unique: true, using: :btree end - create_table "taggings", force: :cascade do |t| + create_table "taggings", id: :serial, force: :cascade do |t| t.integer "tag_id" t.integer "taggable_id" t.string "taggable_type" @@ -2089,14 +2089,14 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["taggable_id", "taggable_type"], name: "index_taggings_on_taggable_id_and_taggable_type", using: :btree end - create_table "tags", force: :cascade do |t| + create_table "tags", id: :serial, force: :cascade do |t| t.string "name" t.integer "taggings_count", default: 0 t.index ["name"], name: "index_tags_on_name", unique: true, using: :btree t.index ["name"], name: "index_tags_on_name_trigram", using: :gin, opclasses: {"name"=>"gin_trgm_ops"} end - create_table "term_agreements", force: :cascade do |t| + create_table "term_agreements", id: :serial, force: :cascade do |t| t.integer "term_id", null: false t.integer "user_id", null: false t.boolean "accepted", default: false, null: false @@ -2107,7 +2107,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_term_agreements_on_user_id", using: :btree end - create_table "timelogs", force: :cascade do |t| + create_table "timelogs", id: :serial, force: :cascade do |t| t.integer "time_spent", null: false t.integer "user_id" t.datetime "created_at", null: false @@ -2120,7 +2120,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_timelogs_on_user_id", using: :btree end - create_table "todos", force: :cascade do |t| + create_table "todos", id: :serial, force: :cascade do |t| t.integer "user_id", null: false t.integer "project_id" t.integer "target_id" @@ -2144,12 +2144,12 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_todos_on_user_id", using: :btree end - create_table "trending_projects", force: :cascade do |t| + create_table "trending_projects", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.index ["project_id"], name: "index_trending_projects_on_project_id", unique: true, using: :btree end - create_table "u2f_registrations", force: :cascade do |t| + create_table "u2f_registrations", id: :serial, force: :cascade do |t| t.text "certificate" t.string "key_handle" t.string "public_key" @@ -2162,7 +2162,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_u2f_registrations_on_user_id", using: :btree end - create_table "uploads", force: :cascade do |t| + create_table "uploads", id: :serial, force: :cascade do |t| t.bigint "size", null: false t.string "path", limit: 511, null: false t.string "checksum", limit: 64 @@ -2179,7 +2179,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["uploader", "path"], name: "index_uploads_on_uploader_and_path", using: :btree end - create_table "user_agent_details", force: :cascade do |t| + create_table "user_agent_details", id: :serial, force: :cascade do |t| t.string "user_agent", null: false t.string "ip_address", null: false t.integer "subject_id", null: false @@ -2190,14 +2190,14 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["subject_id", "subject_type"], name: "index_user_agent_details_on_subject_id_and_subject_type", using: :btree end - create_table "user_callouts", force: :cascade do |t| + create_table "user_callouts", id: :serial, force: :cascade do |t| t.integer "feature_name", null: false t.integer "user_id", null: false t.index ["user_id", "feature_name"], name: "index_user_callouts_on_user_id_and_feature_name", unique: true, using: :btree t.index ["user_id"], name: "index_user_callouts_on_user_id", using: :btree end - create_table "user_custom_attributes", force: :cascade do |t| + create_table "user_custom_attributes", id: :serial, force: :cascade do |t| t.datetime_with_timezone "created_at", null: false t.datetime_with_timezone "updated_at", null: false t.integer "user_id", null: false @@ -2214,7 +2214,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_user_interacted_projects_on_user_id", using: :btree end - create_table "user_preferences", force: :cascade do |t| + create_table "user_preferences", id: :serial, force: :cascade do |t| t.integer "user_id", null: false t.integer "issue_notes_filter", limit: 2, default: 0, null: false t.integer "merge_request_notes_filter", limit: 2, default: 0, null: false @@ -2226,7 +2226,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_user_preferences_on_user_id", unique: true, using: :btree end - create_table "user_statuses", primary_key: "user_id", force: :cascade do |t| + create_table "user_statuses", primary_key: "user_id", id: :serial, force: :cascade do |t| t.integer "cached_markdown_version" t.string "emoji", default: "speech_balloon", null: false t.string "message", limit: 100 @@ -2234,7 +2234,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_user_statuses_on_user_id", using: :btree end - create_table "user_synced_attributes_metadata", force: :cascade do |t| + create_table "user_synced_attributes_metadata", id: :serial, force: :cascade do |t| t.boolean "name_synced", default: false t.boolean "email_synced", default: false t.boolean "location_synced", default: false @@ -2243,7 +2243,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id"], name: "index_user_synced_attributes_metadata_on_user_id", unique: true, using: :btree end - create_table "users", force: :cascade do |t| + create_table "users", id: :serial, force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" @@ -2329,7 +2329,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["username"], name: "index_users_on_username_trigram", using: :gin, opclasses: {"username"=>"gin_trgm_ops"} end - create_table "users_star_projects", force: :cascade do |t| + create_table "users_star_projects", id: :serial, force: :cascade do |t| t.integer "project_id", null: false t.integer "user_id", null: false t.datetime "created_at" @@ -2338,7 +2338,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["user_id", "project_id"], name: "index_users_star_projects_on_user_id_and_project_id", unique: true, using: :btree end - create_table "web_hook_logs", force: :cascade do |t| + create_table "web_hook_logs", id: :serial, force: :cascade do |t| t.integer "web_hook_id", null: false t.string "trigger" t.string "url" @@ -2355,7 +2355,7 @@ ActiveRecord::Schema.define(version: 20190408163745) do t.index ["web_hook_id"], name: "index_web_hook_logs_on_web_hook_id", using: :btree end - create_table "web_hooks", force: :cascade do |t| + create_table "web_hooks", id: :serial, force: :cascade do |t| t.integer "project_id" t.datetime "created_at" t.datetime "updated_at" diff --git a/lib/gitlab/performance_bar/peek_query_tracker.rb b/lib/gitlab/performance_bar/peek_query_tracker.rb index ac392432427..16c16aa0265 100644 --- a/lib/gitlab/performance_bar/peek_query_tracker.rb +++ b/lib/gitlab/performance_bar/peek_query_tracker.rb @@ -26,11 +26,7 @@ module Gitlab subscribe('sql.active_record') do |_, start, finish, _, data| if Gitlab::SafeRequestStore.store[:peek_enabled] - # data[:cached] is only available starting from Rails 5.1.0 - # https://github.com/rails/rails/blob/v5.1.0/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb#L113 - # Before that, data[:name] was set to 'CACHE' - # https://github.com/rails/rails/blob/v4.2.9/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb#L80 - unless data.fetch(:cached, data[:name] == 'CACHE') + unless data[:cached] track_query(data[:sql].strip, data[:binds], start, finish) end end diff --git a/lib/gitlab/search_results.rb b/lib/gitlab/search_results.rb index 8988b9ad7be..a29517e068f 100644 --- a/lib/gitlab/search_results.rb +++ b/lib/gitlab/search_results.rb @@ -113,7 +113,7 @@ module Gitlab issues.full_search(query) end - issues.reorder('updated_at DESC') + issues.reorder('issues.updated_at DESC') end # rubocop: enable CodeReuse/ActiveRecord @@ -121,7 +121,7 @@ module Gitlab def milestones milestones = Milestone.where(project_id: project_ids_relation) milestones = milestones.search(query) - milestones.reorder('updated_at DESC') + milestones.reorder('milestones.updated_at DESC') end # rubocop: enable CodeReuse/ActiveRecord @@ -139,7 +139,7 @@ module Gitlab merge_requests.full_search(query) end - merge_requests.reorder('updated_at DESC') + merge_requests.reorder('merge_requests.updated_at DESC') end # rubocop: enable CodeReuse/ActiveRecord diff --git a/spec/fixtures/api/schemas/entities/issue.json b/spec/fixtures/api/schemas/entities/issue.json index 162fb9c8108..9898819ef75 100644 --- a/spec/fixtures/api/schemas/entities/issue.json +++ b/spec/fixtures/api/schemas/entities/issue.json @@ -5,7 +5,7 @@ "iid": { "type": "integer" }, "author_id": { "type": "integer" }, "description": { "type": ["string", "null"] }, - "lock_version": { "type": ["string", "null"] }, + "lock_version": { "type": ["integer", "null"] }, "milestone_id": { "type": ["string", "null"] }, "title": { "type": "string" }, "moved_to_id": { "type": ["integer", "null"] }, diff --git a/spec/fixtures/api/schemas/entities/merge_request_basic.json b/spec/fixtures/api/schemas/entities/merge_request_basic.json index 88a600398b1..ac0a0314455 100644 --- a/spec/fixtures/api/schemas/entities/merge_request_basic.json +++ b/spec/fixtures/api/schemas/entities/merge_request_basic.json @@ -23,7 +23,7 @@ }, "task_status": { "type": "string" }, "task_status_short": { "type": "string" }, - "lock_version": { "type": ["string", "null"] } + "lock_version": { "type": ["integer", "null"] } }, "additionalProperties": false } diff --git a/spec/javascripts/merge_request_spec.js b/spec/javascripts/merge_request_spec.js index 431798c6ec3..cadcc15385f 100644 --- a/spec/javascripts/merge_request_spec.js +++ b/spec/javascripts/merge_request_spec.js @@ -58,7 +58,7 @@ describe('MergeRequest', function() { { merge_request: { description: '- [ ] Task List Item', - lock_version: undefined, + lock_version: 0, update_task: { line_number: lineNumber, line_source: lineSource, index, checked }, }, }, diff --git a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb index e7ff9169f1b..d3f7f1ded16 100644 --- a/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb +++ b/spec/lib/gitlab/background_migration/deserialize_merge_request_diffs_and_commits_spec.rb @@ -177,7 +177,7 @@ describe Gitlab::BackgroundMigration::DeserializeMergeRequestDiffsAndCommits, :m end before do - allow_any_instance_of(described_class::MergeRequestDiff::ActiveRecord_Relation) + allow_any_instance_of(ActiveRecord::Relation) .to receive(:update_all).and_raise(exception) end diff --git a/spec/lib/gitlab/import_export/attribute_configuration_spec.rb b/spec/lib/gitlab/import_export/attribute_configuration_spec.rb index 87ab81d8169..ddfbb020a55 100644 --- a/spec/lib/gitlab/import_export/attribute_configuration_spec.rb +++ b/spec/lib/gitlab/import_export/attribute_configuration_spec.rb @@ -29,7 +29,7 @@ describe 'Import/Export attribute configuration' do it 'has no new columns' do relation_names.each do |relation_name| relation_class = relation_class_for_name(relation_name) - relation_attributes = relation_class.new.attributes.keys + relation_attributes = relation_class.new.attributes.keys - relation_class.encrypted_attributes.keys.map(&:to_s) current_attributes = parsed_attributes(relation_name, relation_attributes) safe_attributes = safe_model_attributes[relation_class.to_s].dup || [] diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 2cb581696a0..f735a89f69f 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -73,9 +73,8 @@ describe Ci::Runner do end it 'fails to save a group assigned to a project runner even if the runner is already saved' do - group_runner - - expect { create(:group, runners: [project_runner]) } + group.runners << project_runner + expect { group.save! } .to raise_error(ActiveRecord::RecordInvalid) end end diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb index 29515709a74..b331da1acba 100644 --- a/spec/requests/api/runner_spec.rb +++ b/spec/requests/api/runner_spec.rb @@ -68,7 +68,7 @@ describe API::Runner, :clean_gitlab_redis_shared_state do post api('/runners'), params: { token: group.runners_token } expect(response).to have_http_status 201 - expect(group.runners.size).to eq(1) + expect(group.runners.reload.size).to eq(1) runner = Ci::Runner.first expect(runner.token).not_to eq(registration_token) expect(runner.token).not_to eq(group.runners_token) diff --git a/spec/requests/rack_attack_global_spec.rb b/spec/requests/rack_attack_global_spec.rb index 49021f5d1b7..a12646ea222 100644 --- a/spec/requests/rack_attack_global_spec.rb +++ b/spec/requests/rack_attack_global_spec.rb @@ -251,8 +251,8 @@ describe 'Rack Attack global throttles' do let(:throttle_setting_prefix) { 'throttle_authenticated_web' } context 'with the token in the query string' do - let(:get_args) { [rss_url(user), nil] } - let(:other_user_get_args) { [rss_url(other_user), nil] } + let(:get_args) { [rss_url(user), params: nil] } + let(:other_user_get_args) { [rss_url(other_user), params: nil] } it_behaves_like 'rate-limited token-authenticated requests' end diff --git a/spec/services/users/destroy_service_spec.rb b/spec/services/users/destroy_service_spec.rb index 1c79af34538..4a5f4509a7b 100644 --- a/spec/services/users/destroy_service_spec.rb +++ b/spec/services/users/destroy_service_spec.rb @@ -210,6 +210,8 @@ describe Users::DestroyService do describe "calls the before/after callbacks" do it 'of project_members' do + expect_any_instance_of(ProjectMember).to receive(:run_callbacks).with(:find).once + expect_any_instance_of(ProjectMember).to receive(:run_callbacks).with(:initialize).once expect_any_instance_of(ProjectMember).to receive(:run_callbacks).with(:destroy).once service.execute(user) @@ -219,6 +221,8 @@ describe Users::DestroyService do group_member = create(:group_member) group_member.group.group_members.create(user: user, access_level: 40) + expect_any_instance_of(GroupMember).to receive(:run_callbacks).with(:find).once + expect_any_instance_of(GroupMember).to receive(:run_callbacks).with(:initialize).once expect_any_instance_of(GroupMember).to receive(:run_callbacks).with(:destroy).once service.execute(user) diff --git a/spec/services/users/migrate_to_ghost_user_service_spec.rb b/spec/services/users/migrate_to_ghost_user_service_spec.rb index b808fa6d91a..40206775aed 100644 --- a/spec/services/users/migrate_to_ghost_user_service_spec.rb +++ b/spec/services/users/migrate_to_ghost_user_service_spec.rb @@ -80,7 +80,7 @@ describe Users::MigrateToGhostUserService do context "when record migration fails with a rollback exception" do before do - expect_any_instance_of(MergeRequest::ActiveRecord_Associations_CollectionProxy) + expect_any_instance_of(ActiveRecord::Associations::CollectionProxy) .to receive(:update_all).and_raise(ActiveRecord::Rollback) end diff --git a/spec/support/helpers/query_recorder.rb b/spec/support/helpers/query_recorder.rb index 7ce63375d34..c4ae62b25e4 100644 --- a/spec/support/helpers/query_recorder.rb +++ b/spec/support/helpers/query_recorder.rb @@ -17,7 +17,7 @@ module ActiveRecord def callback(name, start, finish, message_id, values) show_backtrace(values) if ENV['QUERY_RECORDER_DEBUG'] - if values[:name]&.include?("CACHE") && skip_cached + if values[:cached] && skip_cached @cached << values[:sql] elsif !values[:name]&.include?("SCHEMA") @log << values[:sql] diff --git a/spec/support/helpers/test_request_helpers.rb b/spec/support/helpers/test_request_helpers.rb index 5a84d67bdfc..39e5dafb059 100644 --- a/spec/support/helpers/test_request_helpers.rb +++ b/spec/support/helpers/test_request_helpers.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module TestRequestHelpers - def test_request(remote_ip: '127.0.0.1') - ActionController::TestRequest.new({ remote_ip: remote_ip }, ActionController::TestSession.new) + def test_request(remote_ip: '127.0.0.1', controller: nil) + ActionController::TestRequest.new({ remote_ip: remote_ip }, ActionController::TestSession.new, controller) end end diff --git a/spec/support/services/migrate_to_ghost_user_service_shared_examples.rb b/spec/support/services/migrate_to_ghost_user_service_shared_examples.rb index 62ae95df8c0..1284415da1f 100644 --- a/spec/support/services/migrate_to_ghost_user_service_shared_examples.rb +++ b/spec/support/services/migrate_to_ghost_user_service_shared_examples.rb @@ -45,7 +45,7 @@ shared_examples "migrating a deleted user's associated records to the ghost user context "race conditions" do context "when #{record_class_name} migration fails and is rolled back" do before do - expect_any_instance_of(record_class::ActiveRecord_Associations_CollectionProxy) + expect_any_instance_of(ActiveRecord::Associations::CollectionProxy) .to receive(:update_all).and_raise(ActiveRecord::Rollback) end @@ -66,7 +66,7 @@ shared_examples "migrating a deleted user's associated records to the ghost user context "when #{record_class_name} migration fails with a non-rollback exception" do before do - expect_any_instance_of(record_class::ActiveRecord_Associations_CollectionProxy) + expect_any_instance_of(ActiveRecord::Associations::CollectionProxy) .to receive(:update_all).and_raise(ArgumentError) end |