Commit b7ebf8a9 authored by dineshpanda's avatar dineshpanda Committed by Stan Hu

Remove dependency on IgnorableColumn concern

`IgnorableColumn` module in `app/models/concerns/ignorable_column.rb`
which is used in models to ignore dealing with specified columns.

In Rails 5 with this [pull
request](https://github.com/rails/rails/pull/21720),
`self.ignored_columns` was introduced to do this job.

For example, in app/models/user.rb:

```ruby
ignore_column :external_email
ignore_column :email_provider
```

can be changed to:

```ruby
self.ignored_columns = %i[external_email email_provider]
```
parent 48dc83a6
......@@ -4,7 +4,6 @@ class ApplicationSetting < ApplicationRecord
include CacheableAttributes
include CacheMarkdownField
include TokenAuthenticatable
include IgnorableColumn
include ChronicDurationAttribute
add_authentication_token_field :runners_registration_token, encrypted: -> { Feature.enabled?(:application_settings_tokens_optional_encryption, default_enabled: true) ? :optional : :required }
......@@ -32,12 +31,14 @@ class ApplicationSetting < ApplicationRecord
serialize :repository_storages # rubocop:disable Cop/ActiveRecordSerialize
serialize :asset_proxy_whitelist, Array # rubocop:disable Cop/ActiveRecordSerialize
ignore_column :koding_url
ignore_column :koding_enabled
ignore_column :sentry_enabled
ignore_column :sentry_dsn
ignore_column :clientside_sentry_enabled
ignore_column :clientside_sentry_dsn
self.ignored_columns = %i[
clientside_sentry_dsn
clientside_sentry_enabled
koding_enabled
koding_url
sentry_dsn
sentry_enabled
]
cache_markdown_field :sign_in_text
cache_markdown_field :help_page_text
......
......@@ -11,19 +11,20 @@ module Ci
include ObjectStorage::BackgroundMove
include Presentable
include Importable
include IgnorableColumn
include Gitlab::Utils::StrongMemoize
include Deployable
include HasRef
BuildArchivedError = Class.new(StandardError)
ignore_column :commands
ignore_column :artifacts_file
ignore_column :artifacts_metadata
ignore_column :artifacts_file_store
ignore_column :artifacts_metadata_store
ignore_column :artifacts_size
self.ignored_columns = %i[
artifacts_file
artifacts_file_store
artifacts_metadata
artifacts_metadata_store
artifacts_size
commands
]
belongs_to :project, inverse_of: :builds
belongs_to :runner
......
......@@ -4,7 +4,6 @@ module Ci
class Runner < ApplicationRecord
extend Gitlab::Ci::Model
include Gitlab::SQL::Pattern
include IgnorableColumn
include RedisCacheable
include ChronicDurationAttribute
include FromUnion
......@@ -36,7 +35,7 @@ module Ci
FORM_EDITABLE = %i[description tag_list active run_untagged locked access_level maximum_timeout_human_readable].freeze
ignore_column :is_shared
self.ignored_columns = %i[is_shared]
has_many :builds
has_many :runner_projects, inverse_of: :runner, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
......
# frozen_string_literal: true
# Module that can be included into a model to make it easier to ignore database
# columns.
#
# Example:
#
# class User < ApplicationRecord
# include IgnorableColumn
#
# ignore_column :updated_at
# end
#
module IgnorableColumn
extend ActiveSupport::Concern
class_methods do
def columns
super.reject { |column| ignored_columns.include?(column.name) }
end
def ignored_columns
@ignored_columns ||= Set.new
end
def ignore_column(*names)
ignored_columns.merge(names.map(&:to_s))
end
end
end
# frozen_string_literal: true
class DeployKey < Key
include IgnorableColumn
include FromUnion
has_many :deploy_keys_projects, inverse_of: :deploy_key, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent
......@@ -11,7 +10,7 @@ class DeployKey < Key
scope :are_public, -> { where(public: true) }
scope :with_projects, -> { includes(deploy_keys_projects: { project: [:route, :namespace] }) }
ignore_column :can_push
self.ignored_columns = %i[can_push]
accepts_nested_attributes_for :deploy_keys_projects
......
......@@ -2,7 +2,6 @@
class Event < ApplicationRecord
include Sortable
include IgnorableColumn
include FromUnion
default_scope { reorder(nil) }
......
......@@ -4,7 +4,6 @@ class MergeRequestDiff < ApplicationRecord
include Sortable
include Importable
include ManualInverseAssociation
include IgnorableColumn
include EachBatch
include Gitlab::Utils::StrongMemoize
include ObjectStorage::BackgroundMove
......
......@@ -14,7 +14,6 @@ class Note < ApplicationRecord
include CacheMarkdownField
include AfterCommitQueue
include ResolvableNote
include IgnorableColumn
include Editable
include Gitlab::SQL::Pattern
include ThrottledTouch
......@@ -34,7 +33,7 @@ class Note < ApplicationRecord
end
end
ignore_column :original_discussion_id
self.ignored_columns = %i[original_discussion_id]
cache_markdown_field :note, pipeline: :note, issuable_state_filter_enabled: true
......
# frozen_string_literal: true
class NotificationSetting < ApplicationRecord
include IgnorableColumn
ignore_column :events
self.ignored_columns = %i[events]
enum level: { global: 3, watch: 2, participating: 1, mention: 4, disabled: 0, custom: 5 }
......
......@@ -13,7 +13,6 @@ class User < ApplicationRecord
include Sortable
include CaseSensitivity
include TokenAuthenticatable
include IgnorableColumn
include FeatureGate
include CreatedAtFilterable
include BulkMemberAccessLoad
......@@ -24,9 +23,11 @@ class User < ApplicationRecord
DEFAULT_NOTIFICATION_LEVEL = :participating
ignore_column :external_email
ignore_column :email_provider
ignore_column :authentication_token
self.ignored_columns = %i[
authentication_token
email_provider
external_email
]
add_authentication_token_field :incoming_email_token, token_generator: -> { SecureRandom.hex.to_i(16).to_s(36) }
add_authentication_token_field :feed_token
......
......@@ -45,15 +45,12 @@ rule.
The first step is to ignore the column in the application code. This is
necessary because Rails caches the columns and re-uses this cache in various
places. This can be done by including the `IgnorableColumn` module into the
model, followed by defining the columns to ignore. For example, to ignore
places. This can be done by defining the columns to ignore. For example, to ignore
`updated_at` in the User model you'd use the following:
```ruby
class User < ActiveRecord::Base
include IgnorableColumn
ignore_column :updated_at
class User < ApplicationRecord
self.ignored_columns = %i[updated_at]
end
```
......@@ -64,8 +61,7 @@ column. Both these changes should be submitted in the same merge request.
Once the changes from step 1 have been released & deployed you can set up a
separate merge request that removes the ignore rule. This merge request can
simply remove the `ignore_column` line, and the `include IgnorableColumn` line
if no other `ignore_column` calls remain.
simply remove the `self.ignored_columns` line.
## Renaming Columns
......
......@@ -9,14 +9,12 @@ module EE
extend ActiveSupport::Concern
prepended do
include IgnorableColumn
EMAIL_ADDITIONAL_TEXT_CHARACTER_LIMIT = 10_000
INSTANCE_REVIEW_MIN_USERS = 100
belongs_to :file_template_project, class_name: "Project"
ignore_column :minimum_mirror_sync_time
self.ignored_columns = %i[minimum_mirror_sync_time]
validates :shared_runners_minutes,
numericality: { greater_than_or_equal_to: 0 }
......
......@@ -19,12 +19,13 @@ module EE
include EE::DeploymentPlatform # rubocop: disable Cop/InjectEnterpriseEditionModule
include EachBatch
include InsightsFeature
include IgnorableColumn
include Vulnerable
ignore_column :mirror_last_update_at,
:mirror_last_successful_update_at,
:next_execution_timestamp
self.ignored_columns = %i[
mirror_last_update_at
mirror_last_successful_update_at
next_execution_timestamp
]
before_save :set_override_pull_mirror_available, unless: -> { ::Gitlab::CurrentSettings.mirror_available }
before_save :set_next_execution_timestamp_to_now, if: ->(project) { project.mirror? && project.mirror_changed? && project.import_state }
......
......@@ -6,8 +6,7 @@ module EE
extend ::Gitlab::Utils::Override
prepended do
include IgnorableColumn
ignore_column :created_at, :updated_at
self.ignored_columns = %i[created_at updated_at]
BACKOFF_PERIOD = 24.seconds
JITTER = 6.seconds
......
......@@ -18,7 +18,7 @@ module EE
prepended do
EMAIL_OPT_IN_SOURCE_ID_GITLAB_COM = 1
ignore_column :support_bot
self.ignored_columns = %i[support_bot]
# We aren't using the `auditor?` method for the `if` condition here
# because `auditor?` returns `false` when the `auditor` column is `true`
......
# frozen_string_literal: true
class ProjectRepositoryState < ApplicationRecord
include IgnorableColumn
include ShaAttribute
ignore_column :last_repository_verification_failed
ignore_column :last_wiki_verification_failed
self.ignored_columns = %i[last_repository_verification_failed last_wiki_verification_failed]
sha_attribute :repository_verification_checksum
sha_attribute :wiki_verification_checksum
......
# frozen_string_literal: true
require 'spec_helper'
describe IgnorableColumn do
let :base_class do
Class.new do
def self.columns
# This method does not have access to "double"
[
Struct.new(:name).new('id'),
Struct.new(:name).new('title'),
Struct.new(:name).new('date')
]
end
end
end
let :model do
Class.new(base_class) do
include IgnorableColumn
end
end
describe '.columns' do
it 'returns the columns, excluding the ignored ones' do
model.ignore_column(:title, :date)
expect(model.columns.map(&:name)).to eq(%w(id))
end
end
describe '.ignored_columns' do
it 'returns a Set' do
expect(model.ignored_columns).to be_an_instance_of(Set)
end
it 'returns the names of the ignored columns' do
model.ignore_column(:title, :date)
expect(model.ignored_columns).to eq(Set.new(%w(title date)))
end
end
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment