adaptive_alias 1.1.1 → 1.2.0
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/CHANGELOG.md +52 -45
- data/README.md +3 -1
- data/gemfiles/6.0.gemfile +1 -0
- data/gemfiles/6.1.gemfile +1 -0
- data/gemfiles/7.0.gemfile +1 -0
- data/lib/adaptive_alias/active_model_patches/read_attribute.rb +1 -0
- data/lib/adaptive_alias/hooks/calculations.rb +16 -0
- data/lib/adaptive_alias/patches/backward_patch.rb +1 -1
- data/lib/adaptive_alias/patches/base.rb +39 -42
- data/lib/adaptive_alias/patches/forward_patch.rb +1 -1
- data/lib/adaptive_alias/version.rb +1 -1
- data/lib/adaptive_alias.rb +6 -16
- metadata +3 -4
- data/lib/adaptive_alias/hooks/association_scope.rb +0 -13
- data/lib/adaptive_alias/hooks/singular_association.rb +0 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ea9cff7fa278b8d8a4fcb07a8acb7cca4e9fc11edea3540314c82f8e8f7bd4c4
|
|
4
|
+
data.tar.gz: 24e34e5bc93827011bc36414cee5513b7ebda21e980b61e282c053436b8b917f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 64fc033de6ab1add5e4bcba89e80bdc4d9c0720856593389ee4802db36890b4a685e153a3629766c5bda34c008ef744283d7b0e8951d82c1240c6863a2fd4edd
|
|
7
|
+
data.tar.gz: d01042b8f6871039a1d448794c596ebc86fd1a7df867aa7bb570d61d6be04ed547b82c478b731d9febd6c006d7075cf276b306f023c6ac760f0cf3e50e8d388c
|
data/CHANGELOG.md
CHANGED
|
@@ -1,45 +1,52 @@
|
|
|
1
|
-
## Change Log
|
|
2
|
-
|
|
3
|
-
### [v1.1.
|
|
4
|
-
- [#
|
|
5
|
-
|
|
6
|
-
### [v1.
|
|
7
|
-
- [#
|
|
8
|
-
- [#
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
- [#
|
|
16
|
-
- [#
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
- [#
|
|
24
|
-
- [#
|
|
25
|
-
|
|
26
|
-
### [v0.2.
|
|
27
|
-
- [#
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
- [#
|
|
31
|
-
- [#
|
|
32
|
-
|
|
33
|
-
### [v0.
|
|
34
|
-
- [#
|
|
35
|
-
- [#
|
|
36
|
-
- [#
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
- [#
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
1
|
+
## Change Log
|
|
2
|
+
|
|
3
|
+
### [v1.1.2](https://github.com/khiav223577/adaptive_alias/compare/v1.1.1...v1.1.2) 2022/10/11
|
|
4
|
+
- [#25](https://github.com/khiav223577/adaptive_alias/pull/25) [Fix] Deal with count, sum, and group (@khiav223577)
|
|
5
|
+
|
|
6
|
+
### [v1.1.1](https://github.com/khiav223577/adaptive_alias/compare/v1.1.0...v1.1.1) 2022/10/07
|
|
7
|
+
- [#24](https://github.com/khiav223577/adaptive_alias/pull/24) [Fix] Disappeared value when instantiating all and then create / update multiple models one by one (@khiav223577)
|
|
8
|
+
- [#23](https://github.com/khiav223577/adaptive_alias/pull/23) [Enhance] No need to determine missing value manually (@khiav223577)
|
|
9
|
+
|
|
10
|
+
### [v1.1.0](https://github.com/khiav223577/adaptive_alias/compare/v1.0.0...v1.1.0) 2022/09/27
|
|
11
|
+
- [#22](https://github.com/khiav223577/adaptive_alias/pull/22) [Fix] Creation via autosave(belongs_to) association (@khiav223577)
|
|
12
|
+
|
|
13
|
+
### [v1.0.0](https://github.com/khiav223577/adaptive_alias/compare/v0.2.4...v1.0.0) 2022/09/22
|
|
14
|
+
- [#21](https://github.com/khiav223577/adaptive_alias/pull/21) [Fix] Model with ignored_columns or calling find_by directly on model class with aliased column argument will fail (@khiav223577)
|
|
15
|
+
- [#20](https://github.com/khiav223577/adaptive_alias/pull/20) [Fix] Problems with STI classes and models that uses same table name (@khiav223577)
|
|
16
|
+
- [#19](https://github.com/khiav223577/adaptive_alias/pull/19) [Fix] Rescue the error when doing direct access to target table's field (@khiav223577)
|
|
17
|
+
|
|
18
|
+
### [v0.2.4](https://github.com/khiav223577/adaptive_alias/compare/v0.2.3...v0.2.4) 2022/08/18
|
|
19
|
+
- [#18](https://github.com/khiav223577/adaptive_alias/pull/18) [Fix] Get model from a relation with join will not generate right query (after migration) (@khiav223577)
|
|
20
|
+
|
|
21
|
+
### [v0.2.3](https://github.com/khiav223577/adaptive_alias/compare/v0.2.2...v0.2.3) 2022/08/17
|
|
22
|
+
- [#17](https://github.com/khiav223577/adaptive_alias/pull/17) [Feature] Support joins (@khiav223577)
|
|
23
|
+
- [#16](https://github.com/khiav223577/adaptive_alias/pull/16) [Enhance] No need to clone node (@khiav223577)
|
|
24
|
+
- [#15](https://github.com/khiav223577/adaptive_alias/pull/15) [Test] Add test cases to test calling pluck on same model (@khiav223577)
|
|
25
|
+
|
|
26
|
+
### [v0.2.2](https://github.com/khiav223577/adaptive_alias/compare/v0.2.1...v0.2.2) 2022/08/11
|
|
27
|
+
- [#14](https://github.com/khiav223577/adaptive_alias/pull/14) [Fix] Fail to use backward-patch when target column has already been migrated (@khiav223577)
|
|
28
|
+
|
|
29
|
+
### [v0.2.1](https://github.com/khiav223577/adaptive_alias/compare/v0.2.0...v0.2.1) 2022/08/11
|
|
30
|
+
- [#13](https://github.com/khiav223577/adaptive_alias/pull/13) [Fix] Nested module include is not supported until ruby 3.0 (@khiav223577)
|
|
31
|
+
- [#12](https://github.com/khiav223577/adaptive_alias/pull/12) [Test] Add test cases to test column_names (@khiav223577)
|
|
32
|
+
|
|
33
|
+
### [v0.2.0](https://github.com/khiav223577/adaptive_alias/compare/v0.1.0...v0.2.0) 2022/08/05
|
|
34
|
+
- [#11](https://github.com/khiav223577/adaptive_alias/pull/11) [Feature] Support polymorphic (@khiav223577)
|
|
35
|
+
- [#10](https://github.com/khiav223577/adaptive_alias/pull/10) [Enhance] Prevent adding methods directly in class / module (@khiav223577)
|
|
36
|
+
- [#9](https://github.com/khiav223577/adaptive_alias/pull/9) [Enhance] Prevent changing original order of where conditions (@khiav223577)
|
|
37
|
+
- [#8](https://github.com/khiav223577/adaptive_alias/pull/8) [Test] Make sure we are reset to use original patch when some test cases fail (@khiav223577)
|
|
38
|
+
- [#7](https://github.com/khiav223577/adaptive_alias/pull/7) [Test] Add test cases to test destroy (@khiav223577)
|
|
39
|
+
|
|
40
|
+
### [v0.1.0](https://github.com/khiav223577/adaptive_alias/compare/v0.0.3...v0.1.0) 2022/08/01
|
|
41
|
+
- [#6](https://github.com/khiav223577/adaptive_alias/pull/6) [Feature] Deal with creating records (@khiav223577)
|
|
42
|
+
- [#5](https://github.com/khiav223577/adaptive_alias/pull/5) [Enhance] Prevent infinite loop if something went wrong (@khiav223577)
|
|
43
|
+
- [#4](https://github.com/khiav223577/adaptive_alias/pull/4) [Fix] Attributes writer method should be defined after schema changes (@khiav223577)
|
|
44
|
+
|
|
45
|
+
### [v0.0.3](https://github.com/khiav223577/adaptive_alias/compare/v0.0.2...v0.0.3) 2022/07/27
|
|
46
|
+
- [#3](https://github.com/khiav223577/adaptive_alias/pull/3) [Fix] Prevent calling custom column names from raising missing attributes (@khiav223577)
|
|
47
|
+
|
|
48
|
+
### [v0.0.2](https://github.com/khiav223577/adaptive_alias/compare/v0.0.1...v0.0.2) 2022/07/26
|
|
49
|
+
- [#2](https://github.com/khiav223577/adaptive_alias/pull/2) [Enhance] Doesn't need rails_compatibility in runtime (@khiav223577)
|
|
50
|
+
|
|
51
|
+
### v0.0.1 2022/07/22
|
|
52
|
+
- [#1](https://github.com/khiav223577/adaptive_alias/pull/1) [Feature] Implement adaptive_alias features (@khiav223577)
|
data/README.md
CHANGED
|
@@ -25,10 +25,12 @@ We need a way to automatically adjust the patch to adapt current schema.
|
|
|
25
25
|
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
This is what this gem wants to achieve. We don't want to do complex migrations, take care of backward-
|
|
28
|
+
This is what this gem wants to achieve. We don't want to do complex migrations, take care of backward-compatibility, and have any downtime.
|
|
29
29
|
Just rely on this gem.
|
|
30
30
|
|
|
31
31
|
|
|
32
|
+
Note that it is not thread-safe when swapping patches, please make sure there is no multi-thread during migration.
|
|
33
|
+
|
|
32
34
|
## Supports
|
|
33
35
|
- Ruby 2.6 ~ 2.7, 3.0 ~ 3.1
|
|
34
36
|
- Rails 6.0, 6.1, 7.0
|
data/gemfiles/6.0.gemfile
CHANGED
data/gemfiles/6.1.gemfile
CHANGED
data/gemfiles/7.0.gemfile
CHANGED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require 'active_record'
|
|
2
|
+
|
|
3
|
+
module AdaptiveAlias
|
|
4
|
+
module Hooks
|
|
5
|
+
module Calculations
|
|
6
|
+
def perform_calculation(*)
|
|
7
|
+
AdaptiveAlias.rescue_statement_invalid(relation: self){ super }
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Nested module include is not supported until ruby 3.0
|
|
14
|
+
class ActiveRecord::Relation
|
|
15
|
+
prepend AdaptiveAlias::Hooks::Calculations
|
|
16
|
+
end
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
module AdaptiveAlias
|
|
4
4
|
module Patches
|
|
5
5
|
class Base
|
|
6
|
-
attr_reader :
|
|
7
|
-
attr_reader :
|
|
6
|
+
attr_reader :check_matched
|
|
7
|
+
attr_reader :remove_and_fix_association
|
|
8
8
|
attr_reader :removed
|
|
9
9
|
attr_reader :removable
|
|
10
10
|
|
|
@@ -23,24 +23,24 @@ module AdaptiveAlias
|
|
|
23
23
|
AdaptiveAlias.get_or_create_model_module(klass).instance_exec do
|
|
24
24
|
remove_method(new_column) if method_defined?(new_column)
|
|
25
25
|
define_method(new_column) do
|
|
26
|
-
|
|
26
|
+
self[new_column]
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
remove_method("#{new_column}=") if method_defined?("#{new_column}=")
|
|
30
30
|
define_method("#{new_column}=") do |*args|
|
|
31
|
-
|
|
31
|
+
super(*args)
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
remove_method(old_column) if method_defined?(old_column)
|
|
35
35
|
define_method(old_column) do
|
|
36
36
|
patch.log_warning if log_warning
|
|
37
|
-
|
|
37
|
+
self[old_column]
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
remove_method("#{old_column}=") if method_defined?("#{old_column}=")
|
|
41
41
|
define_method("#{old_column}=") do |*args|
|
|
42
42
|
patch.log_warning if log_warning
|
|
43
|
-
|
|
43
|
+
super(*args)
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
@@ -54,24 +54,6 @@ module AdaptiveAlias
|
|
|
54
54
|
"Mysql2::Error: Unknown column '#{current_column}' in 'field list'".freeze,
|
|
55
55
|
].freeze
|
|
56
56
|
|
|
57
|
-
expected_attribute_err_msgs = [
|
|
58
|
-
"can't write unknown attribute `#{current_column}`".freeze,
|
|
59
|
-
"missing attribute: #{current_column}".freeze,
|
|
60
|
-
].freeze
|
|
61
|
-
|
|
62
|
-
@fix_missing_attribute = proc do |error_klass, error|
|
|
63
|
-
next false if not patch.removable
|
|
64
|
-
next false if patch.removed
|
|
65
|
-
next false if klass.table_name != error_klass.table_name
|
|
66
|
-
|
|
67
|
-
# Error highlight behavior in Ruby 3.1 pollutes the error message
|
|
68
|
-
error_msg = error.respond_to?(:original_message) ? error.original_message : error.message
|
|
69
|
-
next false if not expected_attribute_err_msgs.include?(error_msg)
|
|
70
|
-
|
|
71
|
-
patch.remove!
|
|
72
|
-
next true
|
|
73
|
-
end
|
|
74
|
-
|
|
75
57
|
fix_arel_attributes = proc do |attr|
|
|
76
58
|
next if not attr.is_a?(Arel::Attributes::Attribute)
|
|
77
59
|
next if attr.name != current_column.to_s
|
|
@@ -87,9 +69,8 @@ module AdaptiveAlias
|
|
|
87
69
|
end
|
|
88
70
|
end
|
|
89
71
|
|
|
90
|
-
@
|
|
72
|
+
@check_matched = proc do |relation, reflection, model, error|
|
|
91
73
|
next false if not patch.removable
|
|
92
|
-
next false if patch.removed
|
|
93
74
|
|
|
94
75
|
# Error highlight behavior in Ruby 3.1 pollutes the error message
|
|
95
76
|
error_msg = error.respond_to?(:original_message) ? error.original_message : error.message
|
|
@@ -103,25 +84,28 @@ module AdaptiveAlias
|
|
|
103
84
|
end
|
|
104
85
|
|
|
105
86
|
next false if not expected_association_err_msgs.include?(error_msg) and not ambiguous
|
|
87
|
+
next true
|
|
88
|
+
end
|
|
106
89
|
|
|
107
|
-
|
|
90
|
+
@remove_and_fix_association = proc do |relation, reflection, &block|
|
|
91
|
+
patch.remove! do
|
|
92
|
+
if relation
|
|
93
|
+
relation.reset # reset @arel
|
|
108
94
|
|
|
109
|
-
|
|
110
|
-
relation.reset # reset @arel
|
|
95
|
+
joins = relation.arel.source.right # @ctx.source.right << create_join(relation, nil, klass)
|
|
111
96
|
|
|
112
|
-
|
|
97
|
+
# adjust select fields
|
|
98
|
+
index = relation.select_values.index(current_column)
|
|
99
|
+
relation.select_values[index] = alias_column if index
|
|
113
100
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
101
|
+
fix_arel_nodes.call(joins.map{|s| s.right.expr })
|
|
102
|
+
fix_arel_nodes.call(relation.where_clause.send(:predicates))
|
|
103
|
+
end
|
|
117
104
|
|
|
118
|
-
|
|
119
|
-
fix_arel_nodes.call(relation.where_clause.send(:predicates))
|
|
120
|
-
end
|
|
105
|
+
reflection.clear_association_scope_cache if reflection
|
|
121
106
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
next true
|
|
107
|
+
block.call
|
|
108
|
+
end
|
|
125
109
|
end
|
|
126
110
|
end
|
|
127
111
|
|
|
@@ -133,15 +117,24 @@ module AdaptiveAlias
|
|
|
133
117
|
end
|
|
134
118
|
|
|
135
119
|
def remove!
|
|
136
|
-
@removed
|
|
120
|
+
if not @removed
|
|
121
|
+
@removed = true
|
|
122
|
+
new_patch = do_remove!
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
yield if block_given?
|
|
126
|
+
ensure
|
|
127
|
+
new_patch.mark_removable if new_patch
|
|
128
|
+
end
|
|
137
129
|
|
|
130
|
+
def do_remove!
|
|
138
131
|
reset_caches(@klass)
|
|
139
132
|
ActiveRecord::Base.descendants.each do |model_klass|
|
|
140
133
|
reset_caches(model_klass) if model_klass.table_name == @klass.table_name
|
|
141
134
|
end
|
|
142
135
|
|
|
143
|
-
@
|
|
144
|
-
@
|
|
136
|
+
@check_matched = nil
|
|
137
|
+
@remove_and_fix_association = nil
|
|
145
138
|
end
|
|
146
139
|
|
|
147
140
|
def mark_removable
|
|
@@ -162,10 +155,14 @@ module AdaptiveAlias
|
|
|
162
155
|
def each_nodes(nodes, &block)
|
|
163
156
|
nodes.each do |node|
|
|
164
157
|
case node
|
|
158
|
+
when Arel::Nodes::Grouping
|
|
159
|
+
each_nodes([node.expr], &block)
|
|
165
160
|
when Arel::Nodes::Equality
|
|
166
161
|
yield(node)
|
|
167
162
|
when Arel::Nodes::And
|
|
168
163
|
each_nodes(node.children, &block)
|
|
164
|
+
when Arel::Nodes::Or
|
|
165
|
+
each_nodes([node.left, node.right], &block)
|
|
169
166
|
end
|
|
170
167
|
end
|
|
171
168
|
end
|
data/lib/adaptive_alias.rb
CHANGED
|
@@ -10,11 +10,10 @@ require 'adaptive_alias/patches/backward_patch'
|
|
|
10
10
|
require 'adaptive_alias/patches/forward_patch'
|
|
11
11
|
|
|
12
12
|
require 'adaptive_alias/hooks/association'
|
|
13
|
-
require 'adaptive_alias/hooks/association_scope'
|
|
14
|
-
require 'adaptive_alias/hooks/singular_association'
|
|
15
13
|
require 'adaptive_alias/hooks/relation'
|
|
16
14
|
require 'adaptive_alias/hooks/active_record_core'
|
|
17
15
|
require 'adaptive_alias/hooks/active_record_persistence'
|
|
16
|
+
require 'adaptive_alias/hooks/calculations'
|
|
18
17
|
|
|
19
18
|
module AdaptiveAlias
|
|
20
19
|
@log_interval = 10 * 60
|
|
@@ -46,21 +45,12 @@ module AdaptiveAlias
|
|
|
46
45
|
def rescue_statement_invalid(relation: nil, reflection: nil, model: nil, &block)
|
|
47
46
|
yield
|
|
48
47
|
rescue ActiveRecord::StatementInvalid => error
|
|
49
|
-
|
|
48
|
+
_key, patch = AdaptiveAlias.current_patches.find{|_key, patch| patch.check_matched.call(relation, reflection, model, error) }
|
|
49
|
+
raise error if patch == nil
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def rescue_missing_attribute(klass, &block)
|
|
57
|
-
yield
|
|
58
|
-
rescue ActiveModel::MissingAttributeError => error
|
|
59
|
-
raise error if AdaptiveAlias.current_patches.all?{|_key, patch| !patch.fix_missing_attribute.call(klass, error) }
|
|
60
|
-
|
|
61
|
-
result = rescue_missing_attribute(klass, &block)
|
|
62
|
-
AdaptiveAlias.current_patches.each_value(&:mark_removable)
|
|
63
|
-
return result
|
|
51
|
+
patch.remove_and_fix_association.call(relation, reflection) do
|
|
52
|
+
return rescue_statement_invalid(relation: relation, reflection: reflection, model: model, &block)
|
|
53
|
+
end
|
|
64
54
|
end
|
|
65
55
|
|
|
66
56
|
def get_or_create_model_module(klass)
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: adaptive_alias
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- khiav reoy
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-10-
|
|
11
|
+
date: 2022-10-12 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -131,9 +131,8 @@ files:
|
|
|
131
131
|
- lib/adaptive_alias/hooks/active_record_core.rb
|
|
132
132
|
- lib/adaptive_alias/hooks/active_record_persistence.rb
|
|
133
133
|
- lib/adaptive_alias/hooks/association.rb
|
|
134
|
-
- lib/adaptive_alias/hooks/
|
|
134
|
+
- lib/adaptive_alias/hooks/calculations.rb
|
|
135
135
|
- lib/adaptive_alias/hooks/relation.rb
|
|
136
|
-
- lib/adaptive_alias/hooks/singular_association.rb
|
|
137
136
|
- lib/adaptive_alias/patches/backward_patch.rb
|
|
138
137
|
- lib/adaptive_alias/patches/base.rb
|
|
139
138
|
- lib/adaptive_alias/patches/forward_patch.rb
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module AdaptiveAlias
|
|
2
|
-
module Hooks
|
|
3
|
-
module AssociationScope
|
|
4
|
-
def last_chain_scope(_scope, reflection, owner)
|
|
5
|
-
AdaptiveAlias.rescue_missing_attribute(owner.class){ super }
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
class ActiveRecord::Associations::AssociationScope
|
|
12
|
-
prepend AdaptiveAlias::Hooks::AssociationScope
|
|
13
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module AdaptiveAlias
|
|
2
|
-
module Hooks
|
|
3
|
-
module SingularAssociation
|
|
4
|
-
def reader(*)
|
|
5
|
-
AdaptiveAlias.rescue_missing_attribute(owner.class){ super }
|
|
6
|
-
end
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
class ActiveRecord::Associations::SingularAssociation
|
|
12
|
-
prepend AdaptiveAlias::Hooks::SingularAssociation
|
|
13
|
-
end
|