Use ApplicationRecord instead of ActiveRecord::Base (#38975).

Patch by Minoru Maeda (@maeda-m).

git-svn-id: https://svn.redmine.org/redmine/trunk@22619 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
Marius Balteanu
2024-01-23 11:52:38 +00:00
parent 28061fbcdb
commit 13aeb797cf
63 changed files with 118 additions and 86 deletions

View File

@@ -129,6 +129,10 @@ Rails/ActiveSupportOnLoad:
# TODO: Need to check the impact on plugins. Disable for now.
- 'lib/redmine/preparation.rb'
Rails/ApplicationRecord:
Exclude:
- 'db/migrate/0*.rb'
Rails/BulkChangeTable:
Exclude:
- 'db/migrate/20120714122200_add_workflows_rule_fields.rb'

View File

@@ -497,10 +497,6 @@ Rails/ApplicationMailer:
- 'app/models/mail_handler.rb'
- 'app/models/mailer.rb'
# This cop supports unsafe autocorrection (--autocorrect-all).
Rails/ApplicationRecord:
Enabled: false
# This cop supports safe autocorrection (--autocorrect).
# Configuration parameters: Include.
# Include: **/test/**/*

View File

@@ -209,7 +209,7 @@ class WatchersController < ApplicationController
nil
end
return unless klass && Class === klass # rubocop:disable Style/CaseEquality
return unless klass < ActiveRecord::Base
return unless klass < ApplicationRecord
return unless klass < Redmine::Acts::Watchable::InstanceMethods
scope = klass.where(:id => Array.wrap(params[:object_id]))

View File

@@ -0,0 +1,32 @@
# frozen_string_literal: true
# Redmine - project management software
# Copyright (C) 2006-2023 Jean-Philippe Lang
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
# Translate attribute names for validation errors display
def self.human_attribute_name(attr, options = {})
prepared_attr = attr.to_s.sub(/_id$/, '').sub(/^.+\./, '')
class_prefix = name.underscore.tr('/', '_')
redmine_default = [
:"field_#{class_prefix}_#{prepared_attr}",
:"field_#{prepared_attr}"
]
options[:default] = redmine_default + Array(options[:default])
super
end
end

View File

@@ -21,7 +21,7 @@ require "digest"
require "fileutils"
require "zip"
class Attachment < ActiveRecord::Base
class Attachment < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :container, :polymorphic => true
belongs_to :author, :class_name => "User"

View File

@@ -22,7 +22,7 @@
class AuthSourceException < StandardError; end
class AuthSourceTimeoutException < AuthSourceException; end
class AuthSource < ActiveRecord::Base
class AuthSource < ApplicationRecord
include Redmine::SafeAttributes
include Redmine::SubclassFactory
include Redmine::Ciphering

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Board < ActiveRecord::Base
class Board < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
has_many :messages, lambda {order("#{Message.table_name}.created_on DESC")}, :dependent => :destroy

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Change < ActiveRecord::Base
class Change < ApplicationRecord
belongs_to :changeset
validates_presence_of :changeset_id, :action, :path

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Changeset < ActiveRecord::Base
class Changeset < ApplicationRecord
belongs_to :repository
belongs_to :user
has_many :filechanges, :class_name => 'Change', :dependent => :delete_all

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Comment < ActiveRecord::Base
class Comment < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :commented, :polymorphic => true, :counter_cache => true
belongs_to :author, :class_name => 'User'

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class CustomField < ActiveRecord::Base
class CustomField < ApplicationRecord
include Redmine::SafeAttributes
include Redmine::SubclassFactory

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class CustomFieldEnumeration < ActiveRecord::Base
class CustomFieldEnumeration < ApplicationRecord
belongs_to :custom_field
validates_presence_of :name, :position, :custom_field_id

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class CustomValue < ActiveRecord::Base
class CustomValue < ApplicationRecord
belongs_to :custom_field
belongs_to :customized, :polymorphic => true

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Document < ActiveRecord::Base
class Document < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
belongs_to :category, :class_name => "DocumentCategory"

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class EmailAddress < ActiveRecord::Base
class EmailAddress < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :user

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class EnabledModule < ActiveRecord::Base
class EnabledModule < ApplicationRecord
belongs_to :project
acts_as_watchable

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Enumeration < ActiveRecord::Base
class Enumeration < ApplicationRecord
include Redmine::SubclassFactory
default_scope lambda {order(:position)}

View File

@@ -19,7 +19,7 @@
require 'csv'
class Import < ActiveRecord::Base
class Import < ApplicationRecord
has_many :items, :class_name => 'ImportItem', :dependent => :delete_all
belongs_to :user
serialize :settings

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class ImportItem < ActiveRecord::Base
class ImportItem < ApplicationRecord
belongs_to :import
validates_presence_of :import_id, :position

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Issue < ActiveRecord::Base
class Issue < ApplicationRecord
include Redmine::SafeAttributes
include Redmine::Utils::DateCalculation
include Redmine::I18n

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssueCategory < ActiveRecord::Base
class IssueCategory < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
belongs_to :assigned_to, :class_name => 'Principal'

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssueRelation < ActiveRecord::Base
class IssueRelation < ApplicationRecord
# Class used to represent the relations of an issue
class Relations < Array
include Redmine::I18n

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class IssueStatus < ActiveRecord::Base
class IssueStatus < ApplicationRecord
include Redmine::SafeAttributes
before_destroy :check_integrity

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Journal < ActiveRecord::Base
class Journal < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :journalized, :polymorphic => true

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class JournalDetail < ActiveRecord::Base
class JournalDetail < ApplicationRecord
belongs_to :journal
def custom_field

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Member < ActiveRecord::Base
class Member < ApplicationRecord
belongs_to :user
belongs_to :principal, :foreign_key => 'user_id'
has_many :member_roles, :dependent => :destroy

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class MemberRole < ActiveRecord::Base
class MemberRole < ApplicationRecord
belongs_to :member
belongs_to :role

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Message < ActiveRecord::Base
class Message < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :board
belongs_to :author, :class_name => 'User'

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class News < ActiveRecord::Base
class News < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
belongs_to :author, :class_name => 'User'

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Principal < ActiveRecord::Base
class Principal < ApplicationRecord
self.table_name = "#{table_name_prefix}users#{table_name_suffix}"
# Account statuses

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Project < ActiveRecord::Base
class Project < ApplicationRecord
include Redmine::SafeAttributes
include Redmine::NestedSet::ProjectNestedSet

View File

@@ -239,7 +239,7 @@ class QueryFilter
end
end
class Query < ActiveRecord::Base
class Query < ApplicationRecord
class StatementInvalid < ::ActiveRecord::StatementInvalid
end

View File

@@ -19,7 +19,7 @@
class ScmFetchError < StandardError; end
class Repository < ActiveRecord::Base
class Repository < ApplicationRecord
include Redmine::Ciphering
include Redmine::SafeAttributes

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Role < ActiveRecord::Base
class Role < ApplicationRecord
include Redmine::SafeAttributes
# Custom coder for the permissions attribute that should be an

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Setting < ActiveRecord::Base
class Setting < ApplicationRecord
PASSWORD_CHAR_CLASSES = {
'uppercase' => /[A-Z]/,
'lowercase' => /[a-z]/,

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class TimeEntry < ActiveRecord::Base
class TimeEntry < ApplicationRecord
include Redmine::SafeAttributes
# could have used polymorphic association
# project association here allows easy loading of time entries at project level with one database trip

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Token < ActiveRecord::Base
class Token < ApplicationRecord
belongs_to :user
validates_uniqueness_of :value, :case_sensitive => true

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Tracker < ActiveRecord::Base
class Tracker < ApplicationRecord
include Redmine::SafeAttributes
CORE_FIELDS_UNDISABLABLE = %w(project_id tracker_id subject is_private).freeze

View File

@@ -19,7 +19,7 @@
require 'redmine/my_page'
class UserPreference < ActiveRecord::Base
class UserPreference < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :user

View File

@@ -108,7 +108,7 @@ module FixedIssuesExtension
end
end
class Version < ActiveRecord::Base
class Version < ApplicationRecord
include Redmine::SafeAttributes
after_update :update_issues_from_sharing_change

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Watcher < ActiveRecord::Base
class Watcher < ApplicationRecord
belongs_to :watchable, :polymorphic => true
belongs_to :user, :class_name => 'Principal'

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class Wiki < ActiveRecord::Base
class Wiki < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :project
has_many :pages, lambda {order(Arel.sql('LOWER(title)').asc)}, :class_name => 'WikiPage', :dependent => :destroy

View File

@@ -19,7 +19,7 @@
require 'zlib'
class WikiContent < ActiveRecord::Base
class WikiContent < ApplicationRecord
self.locking_column = 'version'
belongs_to :page, :class_name => 'WikiPage'
belongs_to :author, :class_name => 'User'

View File

@@ -19,7 +19,7 @@
require 'zlib'
class WikiContentVersion < ActiveRecord::Base
class WikiContentVersion < ApplicationRecord
belongs_to :page, :class_name => 'WikiPage'
belongs_to :author, :class_name => 'User'

View File

@@ -19,7 +19,7 @@
require 'redmine/string_array_diff/diff'
class WikiPage < ActiveRecord::Base
class WikiPage < ApplicationRecord
include Redmine::SafeAttributes
belongs_to :wiki

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class WikiRedirect < ActiveRecord::Base
class WikiRedirect < ApplicationRecord
belongs_to :wiki
validates_presence_of :wiki_id, :title, :redirects_to

View File

@@ -17,7 +17,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
class WorkflowRule < ActiveRecord::Base
class WorkflowRule < ApplicationRecord
self.table_name = "#{table_name_prefix}workflows#{table_name_suffix}"
belongs_to :role

View File

@@ -1,22 +1,6 @@
# frozen_string_literal: true
module ActiveRecord
class Base
# Translate attribute names for validation errors display
def self.human_attribute_name(attr, options = {})
prepared_attr = attr.to_s.delete_suffix('_id').sub(/^.+\./, '')
class_prefix = name.underscore.tr('/', '_')
redmine_default = [
:"field_#{class_prefix}_#{prepared_attr}",
:"field_#{prepared_attr}"
]
options[:default] = redmine_default + Array(options[:default])
super
end
end
# Undefines private Kernel#open method to allow using `open` scopes in models.
# See Defect #11545 (http://www.redmine.org/issues/11545) for details.

View File

@@ -1,4 +1,4 @@
class Meeting < ActiveRecord::Base
class Meeting < ApplicationRecord
belongs_to :project
acts_as_event :title => Proc.new {|o| "#{o.scheduled_on} Meeting"},

View File

@@ -63,6 +63,6 @@ class RedminePluginModelGenerator < Rails::Generators::NamedBase
end
def parent_class_name
options[:parent] || "ActiveRecord::Base"
options[:parent] || "ApplicationRecord"
end
end

View File

@@ -18,4 +18,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_activity_provider'
ActiveRecord::Base.send(:include, Redmine::Acts::ActivityProvider)
Rails.application.reloader.to_prepare do
ApplicationRecord.send(:include, Redmine::Acts::ActivityProvider)
end

View File

@@ -18,4 +18,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_attachable'
ActiveRecord::Base.send(:include, Redmine::Acts::Attachable)
Rails.application.reloader.to_prepare do
ApplicationRecord.send(:include, Redmine::Acts::Attachable)
end

View File

@@ -18,4 +18,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_customizable'
ActiveRecord::Base.send(:include, Redmine::Acts::Customizable)
Rails.application.reloader.to_prepare do
ApplicationRecord.send(:include, Redmine::Acts::Customizable)
end

View File

@@ -18,4 +18,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_event'
ActiveRecord::Base.send(:include, Redmine::Acts::Event)
Rails.application.reloader.to_prepare do
ApplicationRecord.send(:include, Redmine::Acts::Event)
end

View File

@@ -18,4 +18,6 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_relative 'lib/acts_as_searchable'
ActiveRecord::Base.send(:include, Redmine::Acts::Searchable)
Rails.application.reloader.to_prepare do
ApplicationRecord.send(:include, Redmine::Acts::Searchable)
end

View File

@@ -4,7 +4,7 @@ acts_as_tree
Specify this +acts_as+ extension if you want to model a tree structure by providing a parent association and a children
association. This requires that you have a foreign key column, which by default is called +parent_id+.
class Category < ActiveRecord::Base
class Category < ApplicationRecord
acts_as_tree :order => "name"
end

View File

@@ -1,4 +1,6 @@
# frozen_string_literal: true
require_relative 'lib/active_record/acts/tree'
ActiveRecord::Base.send :include, ActiveRecord::Acts::Tree
Rails.application.reloader.to_prepare do
ApplicationRecord.send :include, ActiveRecord::Acts::Tree
end

View File

@@ -10,7 +10,7 @@ module ActiveRecord
# Specify this +acts_as+ extension if you want to model a tree structure by providing a parent association and a children
# association. This requires that you have a foreign key column, which by default is called +parent_id+.
#
# class Category < ActiveRecord::Base
# class Category < ApplicationRecord
# acts_as_tree :order => "name"
# end
#

View File

@@ -42,7 +42,7 @@ def teardown_db
end
end
class Mixin < ActiveRecord::Base
class Mixin < ApplicationRecord
end
class TreeMixin < Mixin

View File

@@ -19,4 +19,6 @@
# Include hook code here
require_relative 'lib/acts_as_watchable'
ActiveRecord::Base.send(:include, Redmine::Acts::Watchable)
Rails.application.reloader.to_prepare do
ApplicationRecord.send(:include, Redmine::Acts::Watchable)
end

View File

@@ -1,4 +1,6 @@
# frozen_string_literal: true
require_relative 'lib/gravatar'
ActionView::Base.send :include, GravatarHelper::PublicMethods
Rails.application.reloader.to_prepare do
ApplicationRecord.send :include, GravatarHelper::PublicMethods
end

View File

@@ -20,9 +20,9 @@
module Redmine
module Preparation
def self.prepare
ActiveRecord::Base.include Redmine::Acts::Positioned
ActiveRecord::Base.include Redmine::Acts::Mentionable
ActiveRecord::Base.include Redmine::I18n
ApplicationRecord.include Redmine::Acts::Positioned
ApplicationRecord.include Redmine::Acts::Mentionable
ApplicationRecord.include Redmine::I18n
Scm::Base.add "Subversion"
Scm::Base.add "Mercurial"

View File

@@ -27,16 +27,16 @@ class PatchesTest < ActiveSupport::TestCase
Setting.default_language = 'en'
end
test "ActiveRecord::Base.human_attribute_name should transform name to field_name" do
assert_equal l('field_last_login_on'), ActiveRecord::Base.human_attribute_name('last_login_on')
test "ApplicationRecord.human_attribute_name should transform name to field_name" do
assert_equal l('field_last_login_on'), ApplicationRecord.human_attribute_name('last_login_on')
end
test "ActiveRecord::Base.human_attribute_name should cut extra _id suffix for better validation" do
assert_equal l('field_last_login_on'), ActiveRecord::Base.human_attribute_name('last_login_on_id')
test "ApplicationRecord.human_attribute_name should cut extra _id suffix for better validation" do
assert_equal l('field_last_login_on'), ApplicationRecord.human_attribute_name('last_login_on_id')
end
test "ActiveRecord::Base.human_attribute_name should default to humanized value if no translation has been found (useful for custom fields)" do
assert_equal 'Patch name', ActiveRecord::Base.human_attribute_name('Patch name')
test "ApplicationRecord.human_attribute_name should default to humanized value if no translation has been found (useful for custom fields)" do
assert_equal 'Patch name', ApplicationRecord.human_attribute_name('Patch name')
end
test 'ActionView::Helpers::FormHelper.date_field should add max=9999-12-31 to limit year value to 4 digits by default' do