Use reflection_class in TableRow for fixtures

With models that use STI, Fixtures now load based
on the refelction class. This allows to resolve the enums
for each specific class instead of just resolving
those of the base class.
This commit is contained in:
Andres Howard 2021-08-30 21:00:52 +00:00 committed by Andres Howard
parent df35d93adf
commit 7b741457e5
6 changed files with 21 additions and 1 deletions

View File

@ -1,3 +1,11 @@
* Load STI Models in fixtures
Data from Fixtures now loads based on the specific class for models with
Single Table Inheritance. This affects enums defined in subclasses, previously
the value of these fields was not parsed and remained `nil`
*Andres Howard*
* `#authenticate` returns false when the password is blank instead of raising an error.
*Muhammad Muhammad Ibrahim*

View File

@ -126,7 +126,7 @@ module ActiveRecord
end
def resolve_enums
model_class.defined_enums.each do |name, values|
reflection_class.defined_enums.each do |name, values|
if @row.include?(name)
@row[name] = values.fetch(@row[name], @row[name])
end

View File

@ -1331,6 +1331,12 @@ class FoxyFixturesTest < ActiveRecord::TestCase
assert_equal pirates(:blackbeard), dead_parrots(:deadbird).killer
end
def test_resolves_enums_in_sti_subclasses
assert_predicate parrots(:george), :australian?
assert_predicate parrots(:louis), :african?
assert_predicate parrots(:frederick), :african?
end
def test_namespaced_models
assert_includes admin_accounts(:signals37).users, admin_users(:david)
assert_equal 2, admin_accounts(:signals37).users.size

View File

@ -8,15 +8,18 @@ george:
name: "Curious George"
treasures: diamond, sapphire
parrot_sti_class: LiveParrot
breed: australian
louis:
name: "King Louis"
treasures: [diamond, sapphire]
parrot_sti_class: LiveParrot
breed: african
frederick:
name: $LABEL
parrot_sti_class: LiveParrot
breed: african
polly:
id: 4
@ -28,6 +31,7 @@ polly:
DEFAULTS: &DEFAULTS
treasures: sapphire, ruby
parrot_sti_class: LiveParrot
breed: australian
davey:
*DEFAULTS

View File

@ -29,6 +29,7 @@ class Parrot < ActiveRecord::Base
end
class LiveParrot < Parrot
enum breed: { african: 0, australian: 1 }
end
class DeadParrot < Parrot

View File

@ -734,6 +734,7 @@ ActiveRecord::Schema.define do
disable_referential_integrity do
create_table :parrots, force: :cascade do |t|
t.string :name
t.integer :breed, default: 0
t.string :color
t.string :parrot_sti_class
t.integer :killer_id