1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activerecord/test/models/comment.rb
Brad Price 0a5b41c4c0 Check that entire collection has been loaded before short circuiting
Currently, when checking that the collection has been loaded, only the first
record is checked. In specific scenarios, if a record is fetched via an `after_initialize`
hook, there is a chance that the first record has been loaded, but other records in the
collection have not.

In order to successfully short circuit the fetching of data, we need to verify that
all of the records in the collection have been loaded.

* Create test for edge case
* Move `reset_callbacks` method to `cases/helper`, since it has been defined in multiple
  locations.

Closes #37730
2019-11-19 15:32:36 -06:00

93 lines
2.2 KiB
Ruby

# frozen_string_literal: true
# `counter_cache` requires association class before `attr_readonly`.
class Post < ActiveRecord::Base; end
class Comment < ActiveRecord::Base
scope :limit_by, lambda { |l| limit(l) }
scope :containing_the_letter_e, -> { where("comments.body LIKE '%e%'") }
scope :not_again, -> { where("comments.body NOT LIKE '%again%'") }
scope :for_first_post, -> { where(post_id: 1) }
scope :for_first_author, -> { joins(:post).where("posts.author_id" => 1) }
scope :created, -> { all }
belongs_to :post, counter_cache: true
belongs_to :author, polymorphic: true
belongs_to :resource, polymorphic: true
has_many :ratings
belongs_to :first_post, foreign_key: :post_id
belongs_to :special_post_with_default_scope, foreign_key: :post_id
has_many :children, class_name: "Comment", foreign_key: :parent_id
belongs_to :parent, class_name: "Comment", counter_cache: :children_count
class ::OopsError < RuntimeError; end
module OopsExtension
def destroy_all(*)
raise OopsError
end
end
default_scope { extending OopsExtension }
scope :oops_comments, -> { extending OopsExtension }
# Should not be called if extending modules that having the method exists on an association.
def self.greeting
raise
end
def self.what_are_you
"a comment..."
end
def self.search_by_type(q)
where("#{QUOTED_TYPE} = ?", q)
end
def self.all_as_method
all
end
scope :all_as_scope, -> { all }
def to_s
body
end
end
class SpecialComment < Comment
has_one :author, through: :post
default_scope { where(deleted_at: nil) }
def self.what_are_you
"a special comment..."
end
end
class SubSpecialComment < SpecialComment
end
class VerySpecialComment < Comment
end
class CommentThatAutomaticallyAltersPostBody < Comment
belongs_to :post, class_name: "PostThatLoadsCommentsInAnAfterSaveHook", foreign_key: :post_id
after_save do |comment|
comment.post.update(body: "Automatically altered")
end
end
class CommentWithDefaultScopeReferencesAssociation < Comment
default_scope -> { includes(:developer).order("developers.name").references(:developer) }
belongs_to :developer
end
class CommentWithAfterCreateUpdate < Comment
after_create do
update(body: "bar")
end
end