aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test/models/developer.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/test/models/developer.rb')
-rw-r--r--activerecord/test/models/developer.rb295
1 files changed, 295 insertions, 0 deletions
diff --git a/activerecord/test/models/developer.rb b/activerecord/test/models/developer.rb
new file mode 100644
index 0000000000..ec48094207
--- /dev/null
+++ b/activerecord/test/models/developer.rb
@@ -0,0 +1,295 @@
+# frozen_string_literal: true
+
+require "ostruct"
+
+module DeveloperProjectsAssociationExtension2
+ def find_least_recent
+ order("id ASC").first
+ end
+end
+
+class Developer < ActiveRecord::Base
+ self.ignored_columns = %w(first_name last_name)
+
+ has_and_belongs_to_many :projects do
+ def find_most_recent
+ order("id DESC").first
+ end
+ end
+
+ belongs_to :mentor
+
+ accepts_nested_attributes_for :projects
+
+ has_and_belongs_to_many :shared_computers, class_name: "Computer"
+
+ has_and_belongs_to_many :projects_extended_by_name,
+ -> { extending(DeveloperProjectsAssociationExtension) },
+ class_name: "Project",
+ join_table: "developers_projects",
+ association_foreign_key: "project_id"
+
+ has_and_belongs_to_many :projects_extended_by_name_twice,
+ -> { extending(DeveloperProjectsAssociationExtension, DeveloperProjectsAssociationExtension2) },
+ class_name: "Project",
+ join_table: "developers_projects",
+ association_foreign_key: "project_id"
+
+ has_and_belongs_to_many :projects_extended_by_name_and_block,
+ -> { extending(DeveloperProjectsAssociationExtension) },
+ class_name: "Project",
+ join_table: "developers_projects",
+ association_foreign_key: "project_id" do
+ def find_least_recent
+ order("id ASC").first
+ end
+ end
+
+ has_and_belongs_to_many :special_projects, join_table: "developers_projects", association_foreign_key: "project_id"
+ has_and_belongs_to_many :sym_special_projects,
+ join_table: :developers_projects,
+ association_foreign_key: "project_id",
+ class_name: "SpecialProject"
+
+ has_many :audit_logs
+ has_many :contracts
+ has_many :firms, through: :contracts, source: :firm
+ has_many :comments, ->(developer) { where(body: "I'm #{developer.name}") }
+ has_many :ratings, through: :comments
+ has_one :ship, dependent: :nullify
+
+ belongs_to :firm
+ has_many :contracted_projects, class_name: "Project"
+
+ scope :jamises, -> { where(name: "Jamis") }
+
+ validates_inclusion_of :salary, in: 50000..200000
+ validates_length_of :name, within: 3..20
+
+ before_create do |developer|
+ developer.audit_logs.build message: "Computer created"
+ end
+
+ attr_accessor :last_name
+ define_attribute_method "last_name"
+
+ def log=(message)
+ audit_logs.build message: message
+ end
+
+ after_find :track_instance_count
+ cattr_accessor :instance_count
+
+ def track_instance_count
+ self.class.instance_count ||= 0
+ self.class.instance_count += 1
+ end
+ private :track_instance_count
+end
+
+class SubDeveloper < Developer
+end
+
+class SymbolIgnoredDeveloper < ActiveRecord::Base
+ self.table_name = "developers"
+ self.ignored_columns = [:first_name, :last_name]
+
+ attr_accessor :last_name
+ define_attribute_method "last_name"
+end
+
+class AuditLog < ActiveRecord::Base
+ belongs_to :developer, validate: true
+ belongs_to :unvalidated_developer, class_name: "Developer"
+end
+
+class DeveloperWithBeforeDestroyRaise < ActiveRecord::Base
+ self.table_name = "developers"
+ has_and_belongs_to_many :projects, join_table: "developers_projects", foreign_key: "developer_id"
+ before_destroy :raise_if_projects_empty!
+
+ def raise_if_projects_empty!
+ raise if projects.empty?
+ end
+end
+
+class DeveloperWithSelect < ActiveRecord::Base
+ self.table_name = "developers"
+ default_scope { select("name") }
+end
+
+class DeveloperWithIncludes < ActiveRecord::Base
+ self.table_name = "developers"
+ has_many :audit_logs, foreign_key: :developer_id
+ default_scope { includes(:audit_logs) }
+end
+
+class DeveloperFilteredOnJoins < ActiveRecord::Base
+ self.table_name = "developers"
+ has_and_belongs_to_many :projects, -> { order("projects.id") }, foreign_key: "developer_id", join_table: "developers_projects"
+
+ def self.default_scope
+ joins(:projects).where(projects: { name: "Active Controller" })
+ end
+end
+
+class DeveloperOrderedBySalary < ActiveRecord::Base
+ self.table_name = "developers"
+ default_scope { order("salary DESC") }
+
+ scope :by_name, -> { order("name DESC") }
+end
+
+class DeveloperCalledDavid < ActiveRecord::Base
+ self.table_name = "developers"
+ default_scope { where("name = 'David'") }
+end
+
+class LazyLambdaDeveloperCalledDavid < ActiveRecord::Base
+ self.table_name = "developers"
+ default_scope lambda { where(name: "David") }
+end
+
+class LazyBlockDeveloperCalledDavid < ActiveRecord::Base
+ self.table_name = "developers"
+ default_scope { where(name: "David") }
+end
+
+class CallableDeveloperCalledDavid < ActiveRecord::Base
+ self.table_name = "developers"
+ default_scope OpenStruct.new(call: where(name: "David"))
+end
+
+class ClassMethodDeveloperCalledDavid < ActiveRecord::Base
+ self.table_name = "developers"
+
+ def self.default_scope
+ where(name: "David")
+ end
+end
+
+class ClassMethodReferencingScopeDeveloperCalledDavid < ActiveRecord::Base
+ self.table_name = "developers"
+ scope :david, -> { where(name: "David") }
+
+ def self.default_scope
+ david
+ end
+end
+
+class LazyBlockReferencingScopeDeveloperCalledDavid < ActiveRecord::Base
+ self.table_name = "developers"
+ scope :david, -> { where(name: "David") }
+ default_scope { david }
+end
+
+class DeveloperCalledJamis < ActiveRecord::Base
+ self.table_name = "developers"
+
+ default_scope { where(name: "Jamis") }
+ scope :poor, -> { where("salary < 150000") }
+ scope :david, -> { where name: "David" }
+ scope :david2, -> { unscoped.where name: "David" }
+end
+
+class PoorDeveloperCalledJamis < ActiveRecord::Base
+ self.table_name = "developers"
+
+ default_scope -> { where(name: "Jamis", salary: 50000) }
+end
+
+class InheritedPoorDeveloperCalledJamis < DeveloperCalledJamis
+ self.table_name = "developers"
+
+ default_scope -> { where(salary: 50000) }
+end
+
+class MultiplePoorDeveloperCalledJamis < ActiveRecord::Base
+ self.table_name = "developers"
+
+ default_scope -> { where(name: "Jamis") }
+ default_scope -> { where(salary: 50000) }
+end
+
+module SalaryDefaultScope
+ extend ActiveSupport::Concern
+
+ included { default_scope { where(salary: 50000) } }
+end
+
+class ModuleIncludedPoorDeveloperCalledJamis < DeveloperCalledJamis
+ self.table_name = "developers"
+
+ include SalaryDefaultScope
+end
+
+class EagerDeveloperWithDefaultScope < ActiveRecord::Base
+ self.table_name = "developers"
+ has_and_belongs_to_many :projects, -> { order("projects.id") }, foreign_key: "developer_id", join_table: "developers_projects"
+
+ default_scope { includes(:projects) }
+end
+
+class EagerDeveloperWithClassMethodDefaultScope < ActiveRecord::Base
+ self.table_name = "developers"
+ has_and_belongs_to_many :projects, -> { order("projects.id") }, foreign_key: "developer_id", join_table: "developers_projects"
+
+ def self.default_scope
+ includes(:projects)
+ end
+end
+
+class EagerDeveloperWithLambdaDefaultScope < ActiveRecord::Base
+ self.table_name = "developers"
+ has_and_belongs_to_many :projects, -> { order("projects.id") }, foreign_key: "developer_id", join_table: "developers_projects"
+
+ default_scope lambda { includes(:projects) }
+end
+
+class EagerDeveloperWithBlockDefaultScope < ActiveRecord::Base
+ self.table_name = "developers"
+ has_and_belongs_to_many :projects, -> { order("projects.id") }, foreign_key: "developer_id", join_table: "developers_projects"
+
+ default_scope { includes(:projects) }
+end
+
+class EagerDeveloperWithCallableDefaultScope < ActiveRecord::Base
+ self.table_name = "developers"
+ has_and_belongs_to_many :projects, -> { order("projects.id") }, foreign_key: "developer_id", join_table: "developers_projects"
+
+ default_scope OpenStruct.new(call: includes(:projects))
+end
+
+class ThreadsafeDeveloper < ActiveRecord::Base
+ self.table_name = "developers"
+
+ def self.default_scope
+ Thread.current[:default_scope_delay].call
+ limit(1)
+ end
+end
+
+class CachedDeveloper < ActiveRecord::Base
+ self.table_name = "developers"
+ self.cache_timestamp_format = :number
+end
+
+class DeveloperWithIncorrectlyOrderedHasManyThrough < ActiveRecord::Base
+ self.table_name = "developers"
+ has_many :companies, through: :contracts
+ has_many :contracts, foreign_key: :developer_id
+end
+
+class DeveloperName < ActiveRecord::Type::String
+ def deserialize(value)
+ "Developer: #{value}"
+ end
+end
+
+class AttributedDeveloper < ActiveRecord::Base
+ self.table_name = "developers"
+
+ attribute :name, DeveloperName.new
+
+ self.ignored_columns += ["name"]
+end