diff options
Diffstat (limited to 'activerecord/test/models/topic.rb')
-rw-r--r-- | activerecord/test/models/topic.rb | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/activerecord/test/models/topic.rb b/activerecord/test/models/topic.rb new file mode 100644 index 0000000000..03430154db --- /dev/null +++ b/activerecord/test/models/topic.rb @@ -0,0 +1,149 @@ +# frozen_string_literal: true + +class Topic < ActiveRecord::Base + scope :base, -> { all } + scope :written_before, lambda { |time| + if time + where "written_on < ?", time + end + } + scope :approved, -> { where(approved: true) } + scope :rejected, -> { where(approved: false) } + + scope :scope_with_lambda, lambda { all } + + scope :by_private_lifo, -> { where(author_name: private_lifo) } + scope :by_lifo, -> { where(author_name: "lifo") } + scope :replied, -> { where "replies_count > 0" } + + class << self + private + def private_lifo + "lifo" + end + end + + scope "approved_as_string", -> { where(approved: true) } + scope :anonymous_extension, -> { } do + def one + 1 + end + end + + scope :with_object, Class.new(Struct.new(:klass)) { + def call + klass.where(approved: true) + end + }.new(self) + + module NamedExtension + def two + 2 + end + end + + has_many :replies, dependent: :destroy, foreign_key: "parent_id", autosave: true + has_many :approved_replies, -> { approved }, class_name: "Reply", foreign_key: "parent_id", counter_cache: "replies_count" + + has_many :unique_replies, dependent: :destroy, foreign_key: "parent_id" + has_many :silly_unique_replies, dependent: :destroy, foreign_key: "parent_id" + + serialize :content + + before_create :default_written_on + before_destroy :destroy_children + + def parent + Topic.find(parent_id) + end + + # trivial method for testing Array#to_xml with :methods + def topic_id + id + end + + alias_attribute :heading, :title + + before_validation :before_validation_for_transaction + before_save :before_save_for_transaction + before_destroy :before_destroy_for_transaction + + after_save :after_save_for_transaction + after_create :after_create_for_transaction + + after_initialize :set_email_address + + attr_accessor :change_approved_before_save + before_save :change_approved_callback + + class_attribute :after_initialize_called + after_initialize do + self.class.after_initialize_called = true + end + + attr_accessor :after_touch_called + + after_initialize do + self.after_touch_called = 0 + end + + after_touch do + self.after_touch_called += 1 + end + + def approved=(val) + @custom_approved = val + write_attribute(:approved, val) + end + + private + + def default_written_on + self.written_on = Time.now unless attribute_present?("written_on") + end + + def destroy_children + self.class.where("parent_id = #{id}").delete_all + end + + def set_email_address + unless persisted? || will_save_change_to_author_email_address? + self.author_email_address = "test@test.com" + end + end + + def before_validation_for_transaction; end + def before_save_for_transaction; end + def before_destroy_for_transaction; end + def after_save_for_transaction; end + def after_create_for_transaction; end + + def change_approved_callback + self.approved = change_approved_before_save unless change_approved_before_save.nil? + end +end + +class ImportantTopic < Topic + serialize :important, Hash +end + +class DefaultRejectedTopic < Topic + default_scope -> { where(approved: false) } +end + +class BlankTopic < Topic + # declared here to make sure that dynamic finder with a bang can find a model that responds to `blank?` + def blank? + true + end +end + +class TitlePrimaryKeyTopic < Topic + self.primary_key = :title +end + +module Web + class Topic < ActiveRecord::Base + has_many :replies, dependent: :destroy, foreign_key: "parent_id", class_name: "Web::Reply" + end +end |