Last active
March 19, 2018 15:07
-
-
Save niborg/39214bd8d088eacd1ffb296b6232060d to your computer and use it in GitHub Desktop.
template demonstrating that :if option in after_commit on: [event] triggered during other lifecycles
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
begin | |
require "bundler/inline" | |
rescue LoadError => e | |
$stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" | |
raise e | |
end | |
gemfile(true) do | |
source "https://rubygems.org" | |
# Activate the gem you are reporting the issue against. | |
gem "activerecord", "5.0.1" | |
gem "sqlite3" | |
end | |
require "active_record" | |
require "minitest/autorun" | |
require "logger" | |
# Ensure backward compatibility with Minitest 4 | |
Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test) | |
# This connection will do for database-independent bug reports. | |
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:") | |
ActiveRecord::Base.logger = Logger.new(STDOUT) | |
ActiveRecord::Schema.define do | |
create_table :posts, force: true do |t| | |
end | |
create_table :comments, force: true do |t| | |
t.integer :commentable_id | |
t.string :commentable_type | |
end | |
end | |
class Post < ActiveRecord::Base | |
has_many :comments, as: :commentable, dependent: :destroy | |
def bar | |
'bar' | |
end | |
end | |
class Comment < ActiveRecord::Base | |
# Polymorphic association used to demonstrate when error might occur, | |
# since it causes :commentable to be nil after destroy. | |
belongs_to :commentable, polymorphic: true | |
after_commit :do_something, on: [:create, :update], if: :foo? | |
def foo? | |
puts "\n***** Checking whether to do_something " \ | |
"(I am destroyed: #{destroyed?}) *****\n\n" | |
STDOUT.flush | |
commentable.bar == 'bar' | |
end | |
def do_something | |
puts "\n***** do_something was performed *****\n\n" | |
STDOUT.flush | |
end | |
end | |
class BugTest < Minitest::Test | |
def test_destroying_post_that_was_created | |
post = Post.create! | |
Comment.create!(commentable: post) | |
post.destroy | |
assert_equal(true, post.destroyed?) | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment