schema_associations 1.2.6 → 1.2.7
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 +5 -5
- data/.travis.yml +6 -0
- data/README.md +9 -3
- data/gemfiles/activerecord-4.2/Gemfile.postgresql +2 -2
- data/gemfiles/activerecord-5.0/Gemfile.base +1 -1
- data/gemfiles/activerecord-5.0/Gemfile.postgresql +2 -2
- data/gemfiles/activerecord-5.1/Gemfile.base +3 -0
- data/gemfiles/activerecord-5.1/Gemfile.mysql2 +10 -0
- data/gemfiles/activerecord-5.1/Gemfile.postgresql +10 -0
- data/gemfiles/activerecord-5.1/Gemfile.sqlite3 +10 -0
- data/gemfiles/activerecord-5.2/Gemfile.base +3 -0
- data/gemfiles/activerecord-5.2/Gemfile.mysql2 +10 -0
- data/gemfiles/activerecord-5.2/Gemfile.postgresql +10 -0
- data/gemfiles/activerecord-5.2/Gemfile.sqlite3 +10 -0
- data/lib/schema_associations/active_record/associations.rb +26 -2
- data/lib/schema_associations/version.rb +1 -1
- data/schema_dev.yml +2 -0
- data/spec/association_spec.rb +30 -1
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 44cb70a92c74e94032088d96228cf1622875c341c4e4f5b9d7563786dde6cf0d
|
4
|
+
data.tar.gz: 2a8fa7848d6fc166fc648ed761e075a508b14ed9b31b4dd64364bb76ae221205
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78104847107eef1060cbb84245730fe60e2c900f1416b969cfb9d3e2359db705d53a150f9e3435422cee7d67c7ae4cca4cfedf8fbdbe73f642c12a2da794a68a
|
7
|
+
data.tar.gz: cbe12ce462e1faeb6db6f45fd0fc902a61348e65093ade4ca453943b855928a16cc5b67324fc3b8dc358e697ef4af3da5b69eb37d7a15f5d4fc586dd901da3cf
|
data/.travis.yml
CHANGED
@@ -13,6 +13,12 @@ gemfile:
|
|
13
13
|
- gemfiles/activerecord-5.0/Gemfile.mysql2
|
14
14
|
- gemfiles/activerecord-5.0/Gemfile.postgresql
|
15
15
|
- gemfiles/activerecord-5.0/Gemfile.sqlite3
|
16
|
+
- gemfiles/activerecord-5.1/Gemfile.mysql2
|
17
|
+
- gemfiles/activerecord-5.1/Gemfile.postgresql
|
18
|
+
- gemfiles/activerecord-5.1/Gemfile.sqlite3
|
19
|
+
- gemfiles/activerecord-5.2/Gemfile.mysql2
|
20
|
+
- gemfiles/activerecord-5.2/Gemfile.postgresql
|
21
|
+
- gemfiles/activerecord-5.2/Gemfile.sqlite3
|
16
22
|
env: POSTGRESQL_DB_USER=postgres MYSQL_DB_USER=travis
|
17
23
|
addons:
|
18
24
|
postgresql: '9.4'
|
data/README.md
CHANGED
@@ -205,7 +205,7 @@ If your forward relation is named "parent", SchemaAssociations names the
|
|
205
205
|
reverse relation "child" or "children". That is, if you have:
|
206
206
|
|
207
207
|
```ruby
|
208
|
-
create_table :nodes
|
208
|
+
create_table :nodes do |t|
|
209
209
|
t.integer :parent_id # schema_plus assumes it's a reference to this table
|
210
210
|
end
|
211
211
|
```
|
@@ -225,14 +225,14 @@ For modularity in your tables and classes, you might use a common prefix for
|
|
225
225
|
related objects. For example, you may have widgets each of which has a color, and each widget might have one frob that has a top color and a bottom color--all from the same set of colors.
|
226
226
|
|
227
227
|
```ruby
|
228
|
-
create_table :widget_colors |t|
|
228
|
+
create_table :widget_colors do |t|
|
229
229
|
end
|
230
230
|
|
231
231
|
create_table :widgets do |t|
|
232
232
|
t.integer :widget_color_id
|
233
233
|
end
|
234
234
|
|
235
|
-
create_table :widget_frobs
|
235
|
+
create_table :widget_frobs do |t|
|
236
236
|
t.integer :widget_id, index: :unique
|
237
237
|
t.integer :top_widget_color_id, references: :widget_colors
|
238
238
|
t.integer :bottom_widget_color_id, references: :widget_colors
|
@@ -420,6 +420,8 @@ SchemaAssociations is tested on all combinations of:
|
|
420
420
|
<!-- These lines are auto-generated by schema_dev based on schema_dev.yml -->
|
421
421
|
* ruby **2.3.1** with activerecord **4.2**, using **mysql2**, **postgresql** or **sqlite3**
|
422
422
|
* ruby **2.3.1** with activerecord **5.0**, using **mysql2**, **postgresql** or **sqlite3**
|
423
|
+
* ruby **2.3.1** with activerecord **5.1**, using **mysql2**, **postgresql** or **sqlite3**
|
424
|
+
* ruby **2.3.1** with activerecord **5.2**, using **mysql2**, **postgresql** or **sqlite3**
|
423
425
|
|
424
426
|
<!-- SCHEMA_DEV: MATRIX - end -->
|
425
427
|
|
@@ -454,6 +456,10 @@ Code coverage results will be in coverage/index.html -- it should be at 100% cov
|
|
454
456
|
|
455
457
|
## Release notes:
|
456
458
|
|
459
|
+
### 1.2.7
|
460
|
+
|
461
|
+
* add in auto deferring of has_* :through associations manually defined on the model so they work in AR 5.1+
|
462
|
+
|
457
463
|
### 1.2.6
|
458
464
|
|
459
465
|
* Support for AR5 (Rails 5).
|
@@ -15,6 +15,11 @@ module SchemaAssociations
|
|
15
15
|
|
16
16
|
module ClassMethods
|
17
17
|
|
18
|
+
def reflections(*args)
|
19
|
+
_load_schema_associations_associations
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
18
23
|
def reflect_on_association(*args)
|
19
24
|
_load_schema_associations_associations
|
20
25
|
super
|
@@ -57,7 +62,6 @@ module SchemaAssociations
|
|
57
62
|
# schema_associations :concise_names => false, :except_type => :has_and_belongs_to_many
|
58
63
|
# end
|
59
64
|
#
|
60
|
-
#
|
61
65
|
def schema_associations(opts={})
|
62
66
|
@schema_associations_config = SchemaAssociations.config.merge({:auto_create => true}.merge(opts))
|
63
67
|
end
|
@@ -66,6 +70,17 @@ module SchemaAssociations
|
|
66
70
|
@schema_associations_config ||= SchemaAssociations.config.dup
|
67
71
|
end
|
68
72
|
|
73
|
+
%i[has_many has_one].each do |m|
|
74
|
+
define_method(m) do |name, *args|
|
75
|
+
if @schema_associations_associations_loaded
|
76
|
+
super name, *args
|
77
|
+
else
|
78
|
+
@schema_associations_deferred_associations ||= []
|
79
|
+
@schema_associations_deferred_associations.push({macro: m, name: name, args: args})
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
69
84
|
private
|
70
85
|
|
71
86
|
def _load_schema_associations_associations
|
@@ -73,6 +88,8 @@ module SchemaAssociations
|
|
73
88
|
return if abstract_class?
|
74
89
|
return unless schema_associations_config.auto_create?
|
75
90
|
|
91
|
+
@schema_associations_associations_loaded = :loading
|
92
|
+
|
76
93
|
reverse_foreign_keys.each do | foreign_key |
|
77
94
|
if foreign_key.from_table =~ /^#{table_name}_(.*)$/ || foreign_key.from_table =~ /^(.*)_#{table_name}$/
|
78
95
|
other_table = $1
|
@@ -90,6 +107,14 @@ module SchemaAssociations
|
|
90
107
|
_define_association(:belongs_to, foreign_key)
|
91
108
|
end
|
92
109
|
|
110
|
+
(@schema_associations_deferred_associations || []).each do |a|
|
111
|
+
argstr = a[:args].inspect[1...-1] + ' # deferred association'
|
112
|
+
_create_association(a[:macro], a[:name], argstr, *a[:args])
|
113
|
+
end
|
114
|
+
if instance_variable_defined? :@schema_associations_deferred_associations
|
115
|
+
remove_instance_variable :@schema_associations_deferred_associations
|
116
|
+
end
|
117
|
+
|
93
118
|
@schema_associations_associations_loaded = true
|
94
119
|
end
|
95
120
|
|
@@ -159,7 +184,6 @@ module SchemaAssociations
|
|
159
184
|
end
|
160
185
|
end
|
161
186
|
|
162
|
-
|
163
187
|
def _determine_association_names(reference_name, referencing_name, references_name)
|
164
188
|
|
165
189
|
references_concise = _concise_name(references_name, referencing_name)
|
data/schema_dev.yml
CHANGED
data/spec/association_spec.rb
CHANGED
@@ -7,6 +7,8 @@ describe ActiveRecord::Base do
|
|
7
7
|
remove_all_models
|
8
8
|
end
|
9
9
|
|
10
|
+
let(:pk_type) { Gem::Requirement.new('< 5.1').satisfied_by?(::ActiveRecord.version) ? :integer : :bigint }
|
11
|
+
|
10
12
|
context "in basic case" do
|
11
13
|
before(:each) do
|
12
14
|
create_tables(
|
@@ -568,6 +570,33 @@ describe ActiveRecord::Base do
|
|
568
570
|
end
|
569
571
|
end
|
570
572
|
|
573
|
+
context 'defining has_many through associations' do
|
574
|
+
before(:each) do
|
575
|
+
create_tables(
|
576
|
+
"users", {}, {},
|
577
|
+
"posts", {}, { :user_id => { foreign_key: true}},
|
578
|
+
"comments", {}, { :post_id => { foreign_key: true}},
|
579
|
+
)
|
580
|
+
class Post < ActiveRecord::Base; end
|
581
|
+
class Comment < ActiveRecord::Base; end
|
582
|
+
class User < ActiveRecord::Base
|
583
|
+
has_many :comments, :through => :posts
|
584
|
+
end
|
585
|
+
end
|
586
|
+
|
587
|
+
it 'should not error when accessing the through association' do
|
588
|
+
reflection = User.reflect_on_association(:posts)
|
589
|
+
expect(reflection).not_to be_nil
|
590
|
+
|
591
|
+
reflection = User.reflect_on_association(:comments)
|
592
|
+
expect(reflection).not_to be_nil
|
593
|
+
expect(reflection.macro).to eq(:has_many)
|
594
|
+
expect(reflection.options[:through]).to eq(:posts)
|
595
|
+
|
596
|
+
expect { User.new.comments }.to_not raise_error
|
597
|
+
end
|
598
|
+
end
|
599
|
+
|
571
600
|
context "regarding existing methods" do
|
572
601
|
before(:each) do
|
573
602
|
create_tables(
|
@@ -702,7 +731,7 @@ describe ActiveRecord::Base do
|
|
702
731
|
table_defs.each_slice(3) do |table_name, opts, columns_with_options|
|
703
732
|
ActiveRecord::Migration.create_table table_name, opts do |t|
|
704
733
|
columns_with_options.each_pair do |column, options|
|
705
|
-
coltype = options.delete(:coltype) ||
|
734
|
+
coltype = options.delete(:coltype) || pk_type
|
706
735
|
t.send coltype, column, options
|
707
736
|
end
|
708
737
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schema_associations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ronen Barzel
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-12-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: schema_plus_foreign_keys
|
@@ -136,6 +136,14 @@ files:
|
|
136
136
|
- gemfiles/activerecord-5.0/Gemfile.mysql2
|
137
137
|
- gemfiles/activerecord-5.0/Gemfile.postgresql
|
138
138
|
- gemfiles/activerecord-5.0/Gemfile.sqlite3
|
139
|
+
- gemfiles/activerecord-5.1/Gemfile.base
|
140
|
+
- gemfiles/activerecord-5.1/Gemfile.mysql2
|
141
|
+
- gemfiles/activerecord-5.1/Gemfile.postgresql
|
142
|
+
- gemfiles/activerecord-5.1/Gemfile.sqlite3
|
143
|
+
- gemfiles/activerecord-5.2/Gemfile.base
|
144
|
+
- gemfiles/activerecord-5.2/Gemfile.mysql2
|
145
|
+
- gemfiles/activerecord-5.2/Gemfile.postgresql
|
146
|
+
- gemfiles/activerecord-5.2/Gemfile.sqlite3
|
139
147
|
- init.rb
|
140
148
|
- lib/schema_associations.rb
|
141
149
|
- lib/schema_associations/active_record/associations.rb
|
@@ -164,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
172
|
version: '0'
|
165
173
|
requirements: []
|
166
174
|
rubyforge_project: schema_associations
|
167
|
-
rubygems_version: 2.
|
175
|
+
rubygems_version: 2.7.8
|
168
176
|
signing_key:
|
169
177
|
specification_version: 4
|
170
178
|
summary: ActiveRecord extension that automatically (DRY) creates associations based
|