diff --git a/lib/fixture_kit/sql_subscriber.rb b/lib/fixture_kit/sql_subscriber.rb index e0ddc13..ad89c48 100644 --- a/lib/fixture_kit/sql_subscriber.rb +++ b/lib/fixture_kit/sql_subscriber.rb @@ -24,7 +24,7 @@ def self.capture(&block) end def self.base_table_model(model) - model = model.superclass until model.superclass.abstract_class? + model = model.superclass until model.superclass == ActiveRecord::Base || model.superclass.abstract_class? model end private_class_method :base_table_model diff --git a/spec/dummy/app/models/gadget.rb b/spec/dummy/app/models/gadget.rb new file mode 100644 index 0000000..8d4aac6 --- /dev/null +++ b/spec/dummy/app/models/gadget.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class Gadget < ActiveRecord::Base +end diff --git a/spec/dummy/app/models/phone.rb b/spec/dummy/app/models/phone.rb new file mode 100644 index 0000000..5927173 --- /dev/null +++ b/spec/dummy/app/models/phone.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class Phone < Gadget +end diff --git a/spec/dummy/app/models/tablet.rb b/spec/dummy/app/models/tablet.rb new file mode 100644 index 0000000..9067298 --- /dev/null +++ b/spec/dummy/app/models/tablet.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +class Tablet < Gadget +end diff --git a/spec/dummy/spec/rails_helper.rb b/spec/dummy/spec/rails_helper.rb index 76dd7e0..1f31dcf 100644 --- a/spec/dummy/spec/rails_helper.rb +++ b/spec/dummy/spec/rails_helper.rb @@ -22,6 +22,7 @@ def setup_databases ActiveRecord::Base.connection.drop_table(:projects, if_exists: true) ActiveRecord::Base.connection.drop_table(:users, if_exists: true) ActiveRecord::Base.connection.drop_table(:vehicles, if_exists: true) + ActiveRecord::Base.connection.drop_table(:gadgets, if_exists: true) end AnalyticsRecord.connection.disable_referential_integrity do @@ -68,6 +69,12 @@ def setup_databases t.timestamps end + ActiveRecord::Base.connection.create_table :gadgets, force: true do |t| + t.string :type, null: false + t.string :name, null: false + t.timestamps + end + AnalyticsRecord.connection.create_table :activity_logs, force: true do |t| t.integer :external_user_id, null: false t.string :action, null: false diff --git a/spec/dummy/test/test_helper.rb b/spec/dummy/test/test_helper.rb index a1076b6..7779a3c 100644 --- a/spec/dummy/test/test_helper.rb +++ b/spec/dummy/test/test_helper.rb @@ -25,6 +25,7 @@ def setup_databases ActiveRecord::Base.connection.drop_table(:projects, if_exists: true) ActiveRecord::Base.connection.drop_table(:users, if_exists: true) ActiveRecord::Base.connection.drop_table(:vehicles, if_exists: true) + ActiveRecord::Base.connection.drop_table(:gadgets, if_exists: true) end AnalyticsRecord.connection.disable_referential_integrity do @@ -71,6 +72,12 @@ def setup_databases t.timestamps end + ActiveRecord::Base.connection.create_table :gadgets, force: true do |t| + t.string :type, null: false + t.string :name, null: false + t.timestamps + end + AnalyticsRecord.connection.create_table :activity_logs, force: true do |t| t.integer :external_user_id, null: false t.string :action, null: false diff --git a/spec/support/dummy_rails_helper.rb b/spec/support/dummy_rails_helper.rb index ab4ee42..f6b7a75 100644 --- a/spec/support/dummy_rails_helper.rb +++ b/spec/support/dummy_rails_helper.rb @@ -33,6 +33,7 @@ def setup_databases ActiveRecord::Base.connection.drop_table(:projects, if_exists: true) ActiveRecord::Base.connection.drop_table(:users, if_exists: true) ActiveRecord::Base.connection.drop_table(:vehicles, if_exists: true) + ActiveRecord::Base.connection.drop_table(:gadgets, if_exists: true) end AnalyticsRecord.connection.disable_referential_integrity do @@ -80,6 +81,12 @@ def setup_databases t.timestamps end + ActiveRecord::Base.connection.create_table :gadgets, force: true do |t| + t.string :type, null: false + t.string :name, null: false + t.timestamps + end + # Analytics database schema AnalyticsRecord.connection.create_table :activity_logs, force: true do |t| t.integer :external_user_id, null: false diff --git a/spec/unit/sql_subscriber_spec.rb b/spec/unit/sql_subscriber_spec.rb index af92f2e..e33bd37 100644 --- a/spec/unit/sql_subscriber_spec.rb +++ b/spec/unit/sql_subscriber_spec.rb @@ -65,6 +65,15 @@ def exercise_user_write_operations(suffix) expect(models).to contain_exactly(Vehicle) end + + it "resolves STI subclasses whose base model inherits directly from ActiveRecord::Base" do + models = described_class.capture do + Phone.create!(name: "iPhone") + Tablet.create!(name: "iPad") + end + + expect(models).to contain_exactly(Gadget) + end end describe "sql.active_record payload name format assumptions" do