trax_model 0.0.98 → 0.0.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +4 -0
- data/lib/trax/model.rb +6 -16
- data/lib/trax/model/attributes.rb +1 -1
- data/lib/trax/model/attributes/definitions.rb +4 -0
- data/lib/trax/model/attributes/{mixin.rb → dsl.rb} +2 -12
- data/lib/trax/model/attributes/types/boolean.rb +1 -2
- data/lib/trax/model/attributes/types/enum.rb +0 -2
- data/lib/trax/model/attributes/types/integer.rb +2 -2
- data/lib/trax/model/attributes/types/set.rb +67 -0
- data/lib/trax/model/attributes/types/string.rb +3 -3
- data/lib/trax/model/attributes/types/struct.rb +5 -3
- data/lib/trax/model/attributes/types/uuid_array.rb +0 -2
- data/lib/trax/model/{sti.rb → core_extensions.rb} +2 -2
- data/lib/trax/model/core_extensions/string.rb +17 -0
- data/lib/trax/model/extensions_for.rb +18 -0
- data/lib/trax/model/extensions_for/base.rb +31 -0
- data/lib/trax/model/extensions_for/boolean.rb +29 -0
- data/lib/trax/model/extensions_for/enumerable.rb +18 -0
- data/lib/trax/model/extensions_for/integer.rb +10 -0
- data/lib/trax/model/extensions_for/numeric.rb +46 -0
- data/lib/trax/model/extensions_for/set.rb +10 -0
- data/lib/trax/model/extensions_for/string.rb +30 -0
- data/lib/trax/model/extensions_for/struct.rb +191 -0
- data/lib/trax/model/extensions_for/struct_fields.rb +21 -0
- data/lib/trax/model/extensions_for/struct_fields/boolean.rb +32 -0
- data/lib/trax/model/extensions_for/struct_fields/enum.rb +20 -0
- data/lib/trax/model/extensions_for/struct_fields/float.rb +12 -0
- data/lib/trax/model/extensions_for/struct_fields/integer.rb +12 -0
- data/lib/trax/model/extensions_for/struct_fields/numeric.rb +52 -0
- data/lib/trax/model/extensions_for/struct_fields/string.rb +29 -0
- data/lib/trax/model/extensions_for/struct_fields/time.rb +54 -0
- data/lib/trax/model/matchable.rb +3 -10
- data/lib/trax/model/mixins.rb +3 -0
- data/lib/trax/model/mixins/freezable.rb +31 -0
- data/lib/trax/model/mixins/restorable.rb +63 -0
- data/lib/trax/model/mixins/sti_enum.rb +4 -5
- data/lib/trax/model/mixins/unique_id.rb +85 -0
- data/lib/trax/model/railtie.rb +4 -2
- data/lib/trax/validators/json_attribute_validator.rb +1 -0
- data/lib/trax_model/version.rb +1 -1
- data/spec/db/schema/default_tables.rb +1 -17
- data/spec/db/schema/pg_tables.rb +15 -0
- data/spec/support/models.rb +11 -16
- data/spec/support/pg/models.rb +31 -6
- data/spec/trax/model/attributes/types/set_spec.rb +68 -0
- data/spec/trax/model/attributes/types/struct_spec.rb +6 -0
- data/spec/trax/model/extensions_for/boolean_spec.rb +26 -0
- data/spec/trax/model/extensions_for/numeric_spec.rb +53 -0
- data/spec/trax/model/extensions_for/string_spec.rb +25 -0
- data/spec/trax/model/extensions_for/struct_spec.rb +223 -0
- data/spec/trax/model/extensions_for_spec.rb +0 -0
- data/spec/trax/model/{freezable_spec.rb → mixins/freezable_spec.rb} +1 -1
- data/spec/trax/model/{restorable_spec.rb → mixins/restorable_spec.rb} +1 -1
- data/spec/trax/model/{unique_id_spec.rb → mixins/unique_id_spec.rb} +1 -1
- data/trax_model.gemspec +4 -5
- metadata +49 -59
- data/lib/trax/model/enum.rb +0 -64
- data/lib/trax/model/freezable.rb +0 -29
- data/lib/trax/model/mti.rb +0 -11
- data/lib/trax/model/mti/abstract.rb +0 -65
- data/lib/trax/model/mti/entity.rb +0 -62
- data/lib/trax/model/mti/namespace.rb +0 -21
- data/lib/trax/model/restorable.rb +0 -61
- data/lib/trax/model/scopes.rb +0 -16
- data/lib/trax/model/sti/attributes.rb +0 -94
- data/lib/trax/model/string_extensions.rb +0 -11
- data/lib/trax/model/struct_extensions.rb +0 -185
- data/lib/trax/model/unique_id.rb +0 -83
- data/spec/trax/model/sti/attributes_spec.rb +0 -15
- data/spec/trax/model/struct_extensions_spec.rb +0 -16
File without changes
|
data/trax_model.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = TraxModel::VERSION
|
9
9
|
spec.authors = ["Jason Ayre"]
|
10
10
|
spec.email = ["jasonayre@gmail.com"]
|
11
|
-
spec.summary = %q{
|
12
|
-
spec.description = %q{
|
11
|
+
spec.summary = %q{Better ActiveRecord attributes, conventions, utilities}
|
12
|
+
spec.description = %q{ActiveRecord attributes DDL, struct/array attribute types, an enum implementation that doesn't suck, etc..}
|
13
13
|
spec.homepage = "http://github.com/jasonayre/trax_model"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -18,10 +18,9 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_dependency "trax_core", "~> 0.0.
|
21
|
+
spec.add_dependency "trax_core", "~> 0.0.84"
|
22
22
|
spec.add_dependency "default_value_for", "~> 3.0.0"
|
23
|
-
spec.
|
24
|
-
spec.add_development_dependency "hashie", ">= 3.4.2"
|
23
|
+
# spec.add_development_dependency "hashie", ">= 3.4.4"
|
25
24
|
spec.add_development_dependency "rails", "~> 4.2.0"
|
26
25
|
spec.add_development_dependency "activerecord", "~> 4.2.0"
|
27
26
|
spec.add_development_dependency "bundler", "~> 1.6"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trax_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.99
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jason Ayre
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: trax_core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.0.
|
19
|
+
version: 0.0.84
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.0.
|
26
|
+
version: 0.0.84
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: default_value_for
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,34 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 3.0.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: simple_enum
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: hashie
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 3.4.2
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: 3.4.2
|
69
41
|
- !ruby/object:Gem::Dependency
|
70
42
|
name: rails
|
71
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -304,8 +276,8 @@ dependencies:
|
|
304
276
|
- - ">="
|
305
277
|
- !ruby/object:Gem::Version
|
306
278
|
version: '0'
|
307
|
-
description:
|
308
|
-
|
279
|
+
description: ActiveRecord attributes DDL, struct/array attribute types, an enum implementation
|
280
|
+
that doesn't suck, etc..
|
309
281
|
email:
|
310
282
|
- jasonayre@gmail.com
|
311
283
|
executables: []
|
@@ -325,42 +297,52 @@ files:
|
|
325
297
|
- lib/trax/model/attributes.rb
|
326
298
|
- lib/trax/model/attributes/attribute.rb
|
327
299
|
- lib/trax/model/attributes/definitions.rb
|
300
|
+
- lib/trax/model/attributes/dsl.rb
|
328
301
|
- lib/trax/model/attributes/errors.rb
|
329
302
|
- lib/trax/model/attributes/fields.rb
|
330
|
-
- lib/trax/model/attributes/mixin.rb
|
331
303
|
- lib/trax/model/attributes/type.rb
|
332
304
|
- lib/trax/model/attributes/types.rb
|
333
305
|
- lib/trax/model/attributes/types/array.rb
|
334
306
|
- lib/trax/model/attributes/types/boolean.rb
|
335
307
|
- lib/trax/model/attributes/types/enum.rb
|
336
308
|
- lib/trax/model/attributes/types/integer.rb
|
309
|
+
- lib/trax/model/attributes/types/set.rb
|
337
310
|
- lib/trax/model/attributes/types/string.rb
|
338
311
|
- lib/trax/model/attributes/types/struct.rb
|
339
312
|
- lib/trax/model/attributes/types/uuid_array.rb
|
340
313
|
- lib/trax/model/attributes/value.rb
|
341
|
-
- lib/trax/model/
|
314
|
+
- lib/trax/model/core_extensions.rb
|
315
|
+
- lib/trax/model/core_extensions/string.rb
|
342
316
|
- lib/trax/model/errors.rb
|
343
|
-
- lib/trax/model/
|
317
|
+
- lib/trax/model/extensions_for.rb
|
318
|
+
- lib/trax/model/extensions_for/base.rb
|
319
|
+
- lib/trax/model/extensions_for/boolean.rb
|
320
|
+
- lib/trax/model/extensions_for/enumerable.rb
|
321
|
+
- lib/trax/model/extensions_for/integer.rb
|
322
|
+
- lib/trax/model/extensions_for/numeric.rb
|
323
|
+
- lib/trax/model/extensions_for/set.rb
|
324
|
+
- lib/trax/model/extensions_for/string.rb
|
325
|
+
- lib/trax/model/extensions_for/struct.rb
|
326
|
+
- lib/trax/model/extensions_for/struct_fields.rb
|
327
|
+
- lib/trax/model/extensions_for/struct_fields/boolean.rb
|
328
|
+
- lib/trax/model/extensions_for/struct_fields/enum.rb
|
329
|
+
- lib/trax/model/extensions_for/struct_fields/float.rb
|
330
|
+
- lib/trax/model/extensions_for/struct_fields/integer.rb
|
331
|
+
- lib/trax/model/extensions_for/struct_fields/numeric.rb
|
332
|
+
- lib/trax/model/extensions_for/struct_fields/string.rb
|
333
|
+
- lib/trax/model/extensions_for/struct_fields/time.rb
|
344
334
|
- lib/trax/model/matchable.rb
|
345
335
|
- lib/trax/model/mixin.rb
|
346
336
|
- lib/trax/model/mixins.rb
|
347
337
|
- lib/trax/model/mixins/field_scopes.rb
|
338
|
+
- lib/trax/model/mixins/freezable.rb
|
348
339
|
- lib/trax/model/mixins/id_scopes.rb
|
340
|
+
- lib/trax/model/mixins/restorable.rb
|
349
341
|
- lib/trax/model/mixins/sort_by_scopes.rb
|
350
342
|
- lib/trax/model/mixins/sti_enum.rb
|
351
|
-
- lib/trax/model/
|
352
|
-
- lib/trax/model/mti/abstract.rb
|
353
|
-
- lib/trax/model/mti/entity.rb
|
354
|
-
- lib/trax/model/mti/namespace.rb
|
343
|
+
- lib/trax/model/mixins/unique_id.rb
|
355
344
|
- lib/trax/model/railtie.rb
|
356
345
|
- lib/trax/model/registry.rb
|
357
|
-
- lib/trax/model/restorable.rb
|
358
|
-
- lib/trax/model/scopes.rb
|
359
|
-
- lib/trax/model/sti.rb
|
360
|
-
- lib/trax/model/sti/attributes.rb
|
361
|
-
- lib/trax/model/string_extensions.rb
|
362
|
-
- lib/trax/model/struct_extensions.rb
|
363
|
-
- lib/trax/model/unique_id.rb
|
364
346
|
- lib/trax/model/uuid.rb
|
365
347
|
- lib/trax/model/uuid_array.rb
|
366
348
|
- lib/trax/model/uuid_prefix.rb
|
@@ -384,18 +366,22 @@ files:
|
|
384
366
|
- spec/trax/model/attributes/fields_spec.rb
|
385
367
|
- spec/trax/model/attributes/types/enum_spec.rb
|
386
368
|
- spec/trax/model/attributes/types/integer_spec.rb
|
369
|
+
- spec/trax/model/attributes/types/set_spec.rb
|
387
370
|
- spec/trax/model/attributes/types/struct_spec.rb
|
388
371
|
- spec/trax/model/attributes_spec.rb
|
389
372
|
- spec/trax/model/errors_spec.rb
|
390
|
-
- spec/trax/model/
|
373
|
+
- spec/trax/model/extensions_for/boolean_spec.rb
|
374
|
+
- spec/trax/model/extensions_for/numeric_spec.rb
|
375
|
+
- spec/trax/model/extensions_for/string_spec.rb
|
376
|
+
- spec/trax/model/extensions_for/struct_spec.rb
|
377
|
+
- spec/trax/model/extensions_for_spec.rb
|
391
378
|
- spec/trax/model/matchable_spec.rb
|
392
379
|
- spec/trax/model/mixins/field_scopes_spec.rb
|
380
|
+
- spec/trax/model/mixins/freezable_spec.rb
|
381
|
+
- spec/trax/model/mixins/restorable_spec.rb
|
393
382
|
- spec/trax/model/mixins/sti_enum_spec.rb
|
383
|
+
- spec/trax/model/mixins/unique_id_spec.rb
|
394
384
|
- spec/trax/model/registry_spec.rb
|
395
|
-
- spec/trax/model/restorable_spec.rb
|
396
|
-
- spec/trax/model/sti/attributes_spec.rb
|
397
|
-
- spec/trax/model/struct_extensions_spec.rb
|
398
|
-
- spec/trax/model/unique_id_spec.rb
|
399
385
|
- spec/trax/model/uuid_prefix_spec.rb
|
400
386
|
- spec/trax/model/uuid_spec.rb
|
401
387
|
- spec/trax/model_spec.rb
|
@@ -428,7 +414,7 @@ rubyforge_project:
|
|
428
414
|
rubygems_version: 2.4.5
|
429
415
|
signing_key:
|
430
416
|
specification_version: 4
|
431
|
-
summary:
|
417
|
+
summary: Better ActiveRecord attributes, conventions, utilities
|
432
418
|
test_files:
|
433
419
|
- spec/db/database.yml
|
434
420
|
- spec/db/schema/default_tables.rb
|
@@ -439,18 +425,22 @@ test_files:
|
|
439
425
|
- spec/trax/model/attributes/fields_spec.rb
|
440
426
|
- spec/trax/model/attributes/types/enum_spec.rb
|
441
427
|
- spec/trax/model/attributes/types/integer_spec.rb
|
428
|
+
- spec/trax/model/attributes/types/set_spec.rb
|
442
429
|
- spec/trax/model/attributes/types/struct_spec.rb
|
443
430
|
- spec/trax/model/attributes_spec.rb
|
444
431
|
- spec/trax/model/errors_spec.rb
|
445
|
-
- spec/trax/model/
|
432
|
+
- spec/trax/model/extensions_for/boolean_spec.rb
|
433
|
+
- spec/trax/model/extensions_for/numeric_spec.rb
|
434
|
+
- spec/trax/model/extensions_for/string_spec.rb
|
435
|
+
- spec/trax/model/extensions_for/struct_spec.rb
|
436
|
+
- spec/trax/model/extensions_for_spec.rb
|
446
437
|
- spec/trax/model/matchable_spec.rb
|
447
438
|
- spec/trax/model/mixins/field_scopes_spec.rb
|
439
|
+
- spec/trax/model/mixins/freezable_spec.rb
|
440
|
+
- spec/trax/model/mixins/restorable_spec.rb
|
448
441
|
- spec/trax/model/mixins/sti_enum_spec.rb
|
442
|
+
- spec/trax/model/mixins/unique_id_spec.rb
|
449
443
|
- spec/trax/model/registry_spec.rb
|
450
|
-
- spec/trax/model/restorable_spec.rb
|
451
|
-
- spec/trax/model/sti/attributes_spec.rb
|
452
|
-
- spec/trax/model/struct_extensions_spec.rb
|
453
|
-
- spec/trax/model/unique_id_spec.rb
|
454
444
|
- spec/trax/model/uuid_prefix_spec.rb
|
455
445
|
- spec/trax/model/uuid_spec.rb
|
456
446
|
- spec/trax/model_spec.rb
|
data/lib/trax/model/enum.rb
DELETED
@@ -1,64 +0,0 @@
|
|
1
|
-
# An opinionated enum preconfiguration:
|
2
|
-
# Uses simple_enum instead of active record built in enum, due to the complete
|
3
|
-
# and utter polution it causes to your classes. in addition, AR does not prefix
|
4
|
-
# enums with anything, i.e.
|
5
|
-
# class User
|
6
|
-
# enum :gender => [:unknown, :male, :female]
|
7
|
-
# enum :locale => [:unknown, :en, :ca]
|
8
|
-
# will break because :unknown cant be used twice, since it defines an User.unknown
|
9
|
-
# method, the value which does not even make sense in alot of situations, out of context
|
10
|
-
#
|
11
|
-
# So, we use simple_enum instead, which will allow us to do that
|
12
|
-
# in addition, I dont like that simple_enum does not allow you to raise errrors at the activerecord
|
13
|
-
# level using validations, therefore you cant reuse the same interface for displaying errors
|
14
|
-
# to the user if an invalid value is picked
|
15
|
-
# so validation is added when an enum is defined
|
16
|
-
# also defines just 2 generic scopes, by_enum_name, and by_enum_name_not, which accept multiple args
|
17
|
-
# i.e. by_gender(:male), by_gender_not(:female, :unknown)
|
18
|
-
# in interest of not polluting the class with scopes for each individual enum value
|
19
|
-
|
20
|
-
module Trax
|
21
|
-
module Model
|
22
|
-
module Enum
|
23
|
-
extend ::Trax::Model::Mixin
|
24
|
-
|
25
|
-
module ClassMethods
|
26
|
-
def define_scopes_for_trax_enum(enum_name)
|
27
|
-
scope_method_name = :"by_#{enum_name}"
|
28
|
-
scope_not_method_name = :"by_#{enum_name}_not"
|
29
|
-
|
30
|
-
self.scope scope_method_name, lambda { |*values|
|
31
|
-
enum_hash = self.__send__("#{enum_name}".pluralize).hash
|
32
|
-
where(enum_name => enum_hash.with_indifferent_access.slice(*values.flatten.compact.uniq).values)
|
33
|
-
}
|
34
|
-
self.scope scope_not_method_name, lambda { |*values|
|
35
|
-
enum_hash = self.__send__("#{enum_name}".pluralize).hash
|
36
|
-
where.not(enum_name => enum_hash.with_indifferent_access.slice(*values.flatten.compact.uniq).values)
|
37
|
-
}
|
38
|
-
end
|
39
|
-
|
40
|
-
#todo: ew need to clean this up
|
41
|
-
def as_enum(enum_name, enum_mapping, options = {})
|
42
|
-
enum_values = enum_mapping.is_a?(Hash) ? enum_mapping.keys : enum_mapping
|
43
|
-
options.assert_valid_keys(:prefix, :source, :message, :default, :validate)
|
44
|
-
|
45
|
-
options[:message] ||= "Invalid value selected for #{enum_name}"
|
46
|
-
options[:prefix] ||= true
|
47
|
-
options[:source] ||= enum_name
|
48
|
-
default_value = options.extract!(:default)[:default] if options.key?(:default)
|
49
|
-
|
50
|
-
validation_options = { :in => enum_values, :message => options.extract!(:message)[:message] }
|
51
|
-
|
52
|
-
self.validates_inclusion_of(enum_name, validation_options) unless options.key?(:validate) && !options[:validate]
|
53
|
-
|
54
|
-
options.delete(:validate) if options.key?(:validate)
|
55
|
-
|
56
|
-
define_scopes_for_trax_enum(enum_name)
|
57
|
-
|
58
|
-
super(enum_name, enum_mapping, options)
|
59
|
-
self.default_value_for(enum_name) { default_value } if default_value
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
data/lib/trax/model/freezable.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
module Trax
|
2
|
-
module Model
|
3
|
-
module Freezable
|
4
|
-
extend ::Trax::Model::Mixin
|
5
|
-
|
6
|
-
included do
|
7
|
-
class_attribute :freezable_fields
|
8
|
-
self.freezable_fields = ::ActiveSupport::OrderedOptions.new
|
9
|
-
end
|
10
|
-
|
11
|
-
module ClassMethods
|
12
|
-
def freezable_by_enum(options = {})
|
13
|
-
freezable_fields.merge!(options)
|
14
|
-
define_frozen_validators_for_enum(options)
|
15
|
-
end
|
16
|
-
|
17
|
-
def define_frozen_validators_for_enum(options)
|
18
|
-
self.class_eval do
|
19
|
-
options.each_pair do |enum_method, frozen_states|
|
20
|
-
validates_with ::FrozenValidator, :if => lambda { |record|
|
21
|
-
frozen_states.any?{ |state| state == :"#{record.send(enum_method)}" } && !record.changed.include?("#{enum_method}")
|
22
|
-
}
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/lib/trax/model/mti.rb
DELETED
@@ -1,65 +0,0 @@
|
|
1
|
-
module Trax
|
2
|
-
module Model
|
3
|
-
module MTI
|
4
|
-
module Abstract
|
5
|
-
extend ::ActiveSupport::Concern
|
6
|
-
|
7
|
-
included do
|
8
|
-
class_attribute :mti_config
|
9
|
-
|
10
|
-
self.abstract_class = true
|
11
|
-
self.mti_config = ::ActiveSupport::HashWithIndifferentAccess.new({
|
12
|
-
:foreign_key => :id
|
13
|
-
})
|
14
|
-
|
15
|
-
scope :records, lambda{
|
16
|
-
map(&:entity)
|
17
|
-
}
|
18
|
-
end
|
19
|
-
|
20
|
-
module ClassMethods
|
21
|
-
def inherited(subklass)
|
22
|
-
super(subklass)
|
23
|
-
|
24
|
-
subklass.after_create do |record|
|
25
|
-
entity_model = mti_config[:class_name].constantize.new
|
26
|
-
|
27
|
-
record.attributes.each_pair do |k,v|
|
28
|
-
entity_model.__send__("#{k}=", v) if entity_model.respond_to?(k)
|
29
|
-
end
|
30
|
-
|
31
|
-
entity_model.save
|
32
|
-
end
|
33
|
-
|
34
|
-
subklass.after_update do |record|
|
35
|
-
entity_model = record.entity
|
36
|
-
|
37
|
-
if record.changed.any?
|
38
|
-
record.changes.each_pair do |k,v|
|
39
|
-
entity_model.__send__("#{k}=", v[1]) if entity.respond_to?(:"#{k}")
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
entity_model.save if entity_model.changed.any?
|
44
|
-
end
|
45
|
-
|
46
|
-
subklass.after_destroy do |record|
|
47
|
-
entity_model = record.entity
|
48
|
-
|
49
|
-
entity_model.destroy
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def entity_model(options)
|
54
|
-
valid_options = options.assert_valid_keys(:class_name, :foreign_key)
|
55
|
-
|
56
|
-
mti_config.merge!(valid_options)
|
57
|
-
|
58
|
-
self.has_one(:entity, mti_config.symbolize_keys)
|
59
|
-
self.accepts_nested_attributes_for(:entity)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
module Trax
|
2
|
-
module Model
|
3
|
-
module MTI
|
4
|
-
module Entity
|
5
|
-
extend ::ActiveSupport::Concern
|
6
|
-
|
7
|
-
included do
|
8
|
-
class_attribute :_mti_namespace
|
9
|
-
|
10
|
-
scope :records, lambda{
|
11
|
-
map(&:entity)
|
12
|
-
}
|
13
|
-
|
14
|
-
scope :fully_loaded, lambda{
|
15
|
-
relation = current_scope.dup
|
16
|
-
entity_ids = relation.pluck(:id)
|
17
|
-
entity_types = entity_ids.map { |id| ::Trax::Model::UUID.new(id[0..1]) }
|
18
|
-
.map(&:record_type)
|
19
|
-
.flatten
|
20
|
-
.compact
|
21
|
-
.uniq
|
22
|
-
|
23
|
-
relation_names = entity_types.map{ |type| :"#{type.name.demodulize.underscore}_entity" }
|
24
|
-
|
25
|
-
current_scope.includes(relation_names).references(relation_names)
|
26
|
-
}
|
27
|
-
end
|
28
|
-
|
29
|
-
def model_type
|
30
|
-
@model_type ||= uuid.record_type
|
31
|
-
end
|
32
|
-
|
33
|
-
def model_type_key
|
34
|
-
:"#{model_type.name.demodulize.underscore}_entity"
|
35
|
-
end
|
36
|
-
|
37
|
-
def model
|
38
|
-
@model ||= __send__(model_type_key)
|
39
|
-
end
|
40
|
-
|
41
|
-
def uuid
|
42
|
-
@uuid ||= self[:id].uuid
|
43
|
-
end
|
44
|
-
|
45
|
-
module ClassMethods
|
46
|
-
def mti_namespace(namespace)
|
47
|
-
_mti_namespace = (namespace.is_a?(String)) ? namespace.constantize : namespace
|
48
|
-
|
49
|
-
_mti_namespace.all.reject{|model| model.abstract_class }.each do |subclass|
|
50
|
-
key = :"#{subclass.name.demodulize.underscore}_entity"
|
51
|
-
has_one key, :class_name => subclass.name, :foreign_key => :id
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def multiple_table_inheritance_namespace(namespace)
|
56
|
-
mti_namespace(namespace)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|