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:
parent
df35d93adf
commit
7b741457e5
@ -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*
|
||||
|
@ -126,7 +126,7 @@ def generate_primary_key
|
||||
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
|
||||
|
@ -1331,6 +1331,12 @@ def test_supports_sti_with_respective_files
|
||||
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
|
||||
|
4
activerecord/test/fixtures/parrots.yml
vendored
4
activerecord/test/fixtures/parrots.yml
vendored
@ -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
|
||||
|
@ -29,6 +29,7 @@ def self.delete_all(*)
|
||||
end
|
||||
|
||||
class LiveParrot < Parrot
|
||||
enum breed: { african: 0, australian: 1 }
|
||||
end
|
||||
|
||||
class DeadParrot < Parrot
|
||||
|
@ -734,6 +734,7 @@
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user