schema_associations 0.1.2 → 1.0.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.
- data/.gitignore +2 -0
- data/.travis.yml +9 -0
- data/README.rdoc +38 -18
- data/Rakefile +1 -1
- data/gemfiles/Gemfile.rails-3.2 +4 -0
- data/gemfiles/Gemfile.rails-3.2.lock +119 -0
- data/lib/schema_associations/active_record/associations.rb +7 -1
- data/lib/schema_associations/version.rb +1 -1
- data/runspecs +56 -24
- data/schema_associations.gemspec +2 -11
- data/spec/association_spec.rb +59 -45
- data/spec/spec_helper.rb +1 -0
- metadata +124 -90
- data/Gemfile +0 -3
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/README.rdoc
CHANGED
@@ -1,22 +1,30 @@
|
|
1
1
|
= SchemaAssociations
|
2
2
|
|
3
|
+
SchemaAssiciations is an ActiveRecord extension that keeps your model class
|
4
|
+
definitions simpler and more DRY, by automatically defining associations
|
5
|
+
based on the database schema.
|
6
|
+
|
7
|
+
{<img src="https://secure.travis-ci.org/lomba/schema_associations.png"/>}[http://travis-ci.org/lomba/schema_associations]
|
8
|
+
{<img src="https://gemnasium.com/lomba/schema_associations.png" alt="Dependency Status" />}[https://gemnasium.com/lomba/schema_associations]
|
9
|
+
|
3
10
|
== Overview
|
4
11
|
|
5
|
-
One of the great things about Rails (ActiveRecord, in particular) is that
|
6
|
-
inspects the database and automatically defines accessors for all your
|
12
|
+
One of the great things about Rails (ActiveRecord, in particular) is that
|
13
|
+
it inspects the database and automatically defines accessors for all your
|
7
14
|
columns, keeping your model class definitions simple and DRY. That's great
|
8
15
|
for simple data columns, but where it falls down is when your table
|
9
16
|
contains references to other tables: then the "accessors" you need are the
|
10
|
-
+belongs_to+, +has_one+, +has_many+, and
|
11
|
-
|
12
|
-
by hand. In fact, for every relation, you need to define two
|
17
|
+
associations defined using +belongs_to+, +has_one+, +has_many+, and
|
18
|
+
+has_and_belongs_to_many+ -- and you need to put them into your model class
|
19
|
+
definitions by hand. In fact, for every relation, you need to define two
|
20
|
+
associations each listing its inverse, such as
|
13
21
|
|
14
22
|
class Post < ActiveRecord::Base
|
15
|
-
has_many :
|
23
|
+
has_many :comments, :inverse_of => :post
|
16
24
|
end
|
17
25
|
|
18
26
|
class Comment < ActiveReocrd::Base
|
19
|
-
belongs_to :post
|
27
|
+
belongs_to :post, :inverse_of => :comments
|
20
28
|
end
|
21
29
|
|
22
30
|
....which isn't so DRY.
|
@@ -42,7 +50,7 @@ Then all you need for your models is:
|
|
42
50
|
class Comment < ActiveRecord::Base
|
43
51
|
end
|
44
52
|
|
45
|
-
and SchemaAssociations defines the appropriate associations under the hood
|
53
|
+
and SchemaAssociations defines the appropriate associations under the hood.
|
46
54
|
|
47
55
|
=== What if I want something special?
|
48
56
|
|
@@ -88,7 +96,7 @@ relationship using standard naming conventions:
|
|
88
96
|
t.integer post_id
|
89
97
|
end
|
90
98
|
|
91
|
-
#
|
99
|
+
# schema_associations defines:
|
92
100
|
|
93
101
|
class Post < ActiveRecord::Base
|
94
102
|
has_many :comments
|
@@ -106,7 +114,7 @@ For a one-to-one relationship:
|
|
106
114
|
t.integer post_id, :index => :unique # (using the :index option provided by schema_plus )
|
107
115
|
end
|
108
116
|
|
109
|
-
#
|
117
|
+
# schema_associations defines:
|
110
118
|
|
111
119
|
class Post < ActiveRecord::Base
|
112
120
|
has_one :comment
|
@@ -125,6 +133,8 @@ And for many-to-many relationships:
|
|
125
133
|
integer :member_id
|
126
134
|
end
|
127
135
|
|
136
|
+
# schema_associations defines:
|
137
|
+
|
128
138
|
class Group < ActiveReocrd::Base
|
129
139
|
has_and_belongs_to_many :members
|
130
140
|
end
|
@@ -264,8 +274,10 @@ use cases that you logged).
|
|
264
274
|
== Compatibility
|
265
275
|
|
266
276
|
SchemaAssociations supports all combinations of:
|
267
|
-
* rails
|
268
|
-
* MRI ruby 1.
|
277
|
+
* rails 3.2
|
278
|
+
* MRI ruby 1.9.2 or 1.9.3
|
279
|
+
|
280
|
+
Note: As of version 1.0.0, ruby 1.8.7 and rails < 3.2 are no longer supported. The last version to support them is 0.1.2
|
269
281
|
|
270
282
|
== Installation
|
271
283
|
|
@@ -287,13 +299,21 @@ full combo of tests, after you've forked & cloned:
|
|
287
299
|
$ ./runspecs --install # do this once to install gem dependencies for all versions (slow)
|
288
300
|
$ ./runspecs # as many times as you like
|
289
301
|
|
290
|
-
See <tt>./runspecs --help</tt> for
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
$
|
302
|
+
See <tt>./runspecs --help</tt> for more options. In particular, to run
|
303
|
+
rspec on a specific file or example (rather than running the full suite)
|
304
|
+
you can do, e.g.
|
305
|
+
|
306
|
+
$ ./runspecs [other options] --rspec -- spec/association_spec.rb -e 'base'
|
307
|
+
|
308
|
+
If you're running ruby 1.9, code coverage results will be in coverage/index.html -- it should be at 100% coverage.
|
309
|
+
|
310
|
+
== Release notes:
|
311
|
+
|
312
|
+
=== 1.0.0
|
313
|
+
|
314
|
+
* Use :inverse_of in generated associations
|
295
315
|
|
296
|
-
|
316
|
+
* Drop support for ruby 1.8.7 and rails < 3.2
|
297
317
|
|
298
318
|
== History
|
299
319
|
|
data/Rakefile
CHANGED
@@ -0,0 +1,119 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/ronen/github/schema_associations
|
3
|
+
specs:
|
4
|
+
schema_associations (0.1.2)
|
5
|
+
schema_plus
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
actionmailer (3.2.11)
|
11
|
+
actionpack (= 3.2.11)
|
12
|
+
mail (~> 2.4.4)
|
13
|
+
actionpack (3.2.11)
|
14
|
+
activemodel (= 3.2.11)
|
15
|
+
activesupport (= 3.2.11)
|
16
|
+
builder (~> 3.0.0)
|
17
|
+
erubis (~> 2.7.0)
|
18
|
+
journey (~> 1.0.4)
|
19
|
+
rack (~> 1.4.0)
|
20
|
+
rack-cache (~> 1.2)
|
21
|
+
rack-test (~> 0.6.1)
|
22
|
+
sprockets (~> 2.2.1)
|
23
|
+
activemodel (3.2.11)
|
24
|
+
activesupport (= 3.2.11)
|
25
|
+
builder (~> 3.0.0)
|
26
|
+
activerecord (3.2.11)
|
27
|
+
activemodel (= 3.2.11)
|
28
|
+
activesupport (= 3.2.11)
|
29
|
+
arel (~> 3.0.2)
|
30
|
+
tzinfo (~> 0.3.29)
|
31
|
+
activeresource (3.2.11)
|
32
|
+
activemodel (= 3.2.11)
|
33
|
+
activesupport (= 3.2.11)
|
34
|
+
activesupport (3.2.11)
|
35
|
+
i18n (~> 0.6)
|
36
|
+
multi_json (~> 1.0)
|
37
|
+
arel (3.0.2)
|
38
|
+
builder (3.0.4)
|
39
|
+
diff-lcs (1.1.3)
|
40
|
+
erubis (2.7.0)
|
41
|
+
hike (1.2.1)
|
42
|
+
i18n (0.6.1)
|
43
|
+
journey (1.0.4)
|
44
|
+
json (1.7.6)
|
45
|
+
mail (2.4.4)
|
46
|
+
i18n (>= 0.4.0)
|
47
|
+
mime-types (~> 1.16)
|
48
|
+
treetop (~> 1.4.8)
|
49
|
+
mime-types (1.19)
|
50
|
+
multi_json (1.5.0)
|
51
|
+
polyglot (0.3.3)
|
52
|
+
rack (1.4.4)
|
53
|
+
rack-cache (1.2)
|
54
|
+
rack (>= 0.4)
|
55
|
+
rack-ssl (1.3.2)
|
56
|
+
rack
|
57
|
+
rack-test (0.6.2)
|
58
|
+
rack (>= 1.0)
|
59
|
+
rails (3.2.11)
|
60
|
+
actionmailer (= 3.2.11)
|
61
|
+
actionpack (= 3.2.11)
|
62
|
+
activerecord (= 3.2.11)
|
63
|
+
activeresource (= 3.2.11)
|
64
|
+
activesupport (= 3.2.11)
|
65
|
+
bundler (~> 1.0)
|
66
|
+
railties (= 3.2.11)
|
67
|
+
railties (3.2.11)
|
68
|
+
actionpack (= 3.2.11)
|
69
|
+
activesupport (= 3.2.11)
|
70
|
+
rack-ssl (~> 1.3.2)
|
71
|
+
rake (>= 0.8.7)
|
72
|
+
rdoc (~> 3.4)
|
73
|
+
thor (>= 0.14.6, < 2.0)
|
74
|
+
rake (10.0.3)
|
75
|
+
rdoc (3.12)
|
76
|
+
json (~> 1.4)
|
77
|
+
rspec (2.12.0)
|
78
|
+
rspec-core (~> 2.12.0)
|
79
|
+
rspec-expectations (~> 2.12.0)
|
80
|
+
rspec-mocks (~> 2.12.0)
|
81
|
+
rspec-core (2.12.2)
|
82
|
+
rspec-expectations (2.12.1)
|
83
|
+
diff-lcs (~> 1.1.3)
|
84
|
+
rspec-mocks (2.12.1)
|
85
|
+
schema_plus (1.0.0)
|
86
|
+
rails (>= 3.2)
|
87
|
+
valuable
|
88
|
+
simplecov (0.7.1)
|
89
|
+
multi_json (~> 1.0)
|
90
|
+
simplecov-html (~> 0.7.1)
|
91
|
+
simplecov-gem-adapter (1.0.1)
|
92
|
+
simplecov
|
93
|
+
simplecov-html (0.7.1)
|
94
|
+
sprockets (2.2.2)
|
95
|
+
hike (~> 1.2)
|
96
|
+
multi_json (~> 1.0)
|
97
|
+
rack (~> 1.0)
|
98
|
+
tilt (~> 1.1, != 1.3.0)
|
99
|
+
sqlite3 (1.3.7)
|
100
|
+
thor (0.16.0)
|
101
|
+
tilt (1.3.3)
|
102
|
+
treetop (1.4.12)
|
103
|
+
polyglot
|
104
|
+
polyglot (>= 0.3.1)
|
105
|
+
tzinfo (0.3.35)
|
106
|
+
valuable (0.9.6)
|
107
|
+
|
108
|
+
PLATFORMS
|
109
|
+
ruby
|
110
|
+
|
111
|
+
DEPENDENCIES
|
112
|
+
rails (~> 3.2.0)
|
113
|
+
rake
|
114
|
+
rdoc
|
115
|
+
rspec
|
116
|
+
schema_associations!
|
117
|
+
simplecov
|
118
|
+
simplecov-gem-adapter
|
119
|
+
sqlite3
|
@@ -114,8 +114,14 @@ module SchemaAssociations
|
|
114
114
|
when :belongs_to
|
115
115
|
name = names[:belongs_to]
|
116
116
|
opts = {:class_name => references_class_name, :foreign_key => column_name}
|
117
|
+
if connection.indexes(fk.references_table_name, "#{fk.references_table_name} Indexes").any?{|index| index.unique && index.columns == [column_name]}
|
118
|
+
opts[:inverse_of] = names[:has_one]
|
119
|
+
else
|
120
|
+
opts[:inverse_of] = names[:has_many]
|
121
|
+
end
|
122
|
+
|
117
123
|
when :has_one_or_many
|
118
|
-
opts = {:class_name => referencing_class_name, :foreign_key => column_name}
|
124
|
+
opts = {:class_name => referencing_class_name, :foreign_key => column_name, :inverse_of => names[:belongs_to]}
|
119
125
|
# use connection.indexes and connection.colums rather than class
|
120
126
|
# methods of the referencing class because using the class
|
121
127
|
# methods would require getting the class -- which might trigger
|
data/runspecs
CHANGED
@@ -2,20 +2,27 @@
|
|
2
2
|
|
3
3
|
require 'optparse'
|
4
4
|
require 'ostruct'
|
5
|
+
require 'shellwords'
|
6
|
+
require 'tempfile'
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
RUBY_VERSIONS = %W[1.8.7 1.9.2]
|
9
|
-
RAILS_VERSIONS = %W[2.3 3.0 3.1]
|
8
|
+
RUBY_VERSIONS = %W[1.9.2 1.9.3]
|
9
|
+
RAILS_VERSIONS = %W[3.2]
|
10
10
|
|
11
11
|
o = OpenStruct.new
|
12
12
|
o.ruby_versions = RUBY_VERSIONS
|
13
13
|
o.rails_versions = RAILS_VERSIONS
|
14
|
-
o.run_cmd = "rake spec"
|
15
14
|
|
16
15
|
OptionParser.new do |opts|
|
17
16
|
opts.banner = "Usage: #{$0} [options]"
|
18
17
|
|
18
|
+
opts.on("-n", "--dry-run", "Do a dry run without executing actions") do |v|
|
19
|
+
o.dry_run = true
|
20
|
+
end
|
21
|
+
|
22
|
+
opts.on("--update", "Update gem dependencies") do |v|
|
23
|
+
o.update = v
|
24
|
+
end
|
25
|
+
|
19
26
|
opts.on("--install", "Install gem dependencies") do |v|
|
20
27
|
o.install = v
|
21
28
|
end
|
@@ -33,26 +40,51 @@ OptionParser.new do |opts|
|
|
33
40
|
o.rails_versions = [RAILS_VERSIONS.last]
|
34
41
|
end
|
35
42
|
|
43
|
+
opts.on("--rspec", "run rspec rather than rake") do |v|
|
44
|
+
o.rspec = v
|
45
|
+
end
|
46
|
+
|
36
47
|
end.parse!
|
37
48
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
total = o.ruby_versions.size * o.rails_versions.size
|
46
|
-
o.ruby_versions.each do |ruby|
|
47
|
-
o.rails_versions.each do |rails|
|
48
|
-
puts "\n\n*** ruby version #{ruby} - rails version #{rails} [#{n} of #{total}]\n\n"
|
49
|
-
n += 1
|
50
|
-
allcmds = []
|
51
|
-
allcmds << "rvm use #{ruby}"
|
52
|
-
allcmds << "export #{PROJECT.upcase}_RAILS_VERSION=#{rails}"
|
53
|
-
allcmds += cmds
|
54
|
-
allcmds << 'exit'
|
55
|
-
system %Q{echo '#{allcmds.join(' \n ')}' | bash -i} or abort "aborting #{$0}"
|
49
|
+
|
50
|
+
Combo = Struct.new(:ruby, :rails)
|
51
|
+
|
52
|
+
combos = o.ruby_versions.product(o.rails_versions).map{|product| Combo.new(*product)}.select {|combo|
|
53
|
+
case
|
54
|
+
when combo.rails >= "3.2" && combo.ruby <= "1.8.7" then false
|
55
|
+
else true
|
56
56
|
end
|
57
|
-
|
57
|
+
}
|
58
|
+
|
59
|
+
|
60
|
+
GEMFILES_DIR = File.expand_path('../gemfiles', __FILE__)
|
61
|
+
errs = []
|
62
|
+
combos.each_with_index do |combo, n|
|
63
|
+
ruby = combo.ruby
|
64
|
+
rails = combo.rails
|
65
|
+
|
66
|
+
cmd = case
|
67
|
+
when o.update
|
68
|
+
"bundle update"
|
69
|
+
when o.install
|
70
|
+
"bundle install"
|
71
|
+
when o.rspec
|
72
|
+
"bundle exec rspec"
|
73
|
+
else
|
74
|
+
"bundle exec rake spec"
|
75
|
+
end
|
76
|
+
|
77
|
+
command = %Q{BUNDLE_GEMFILE="#{File.join(GEMFILES_DIR, "Gemfile.rails-#{rails}")}" rvm #{ruby} do #{cmd} #{Shellwords.join(ARGV)}}
|
58
78
|
|
79
|
+
puts "\n\n*** ruby version #{ruby} - rails version #{rails} [#{n+1} of #{combos.size}]\n\n#{command}"
|
80
|
+
|
81
|
+
next if o.dry_run
|
82
|
+
|
83
|
+
Tempfile.open('runspecs') do |file|
|
84
|
+
system("(#{command}) 2>&1 | tee #{file.path}")
|
85
|
+
file.rewind
|
86
|
+
errs << "ruby #{ruby}, rails #{rails}" if file.readlines.grep(/^Failed examples/).any?
|
87
|
+
end
|
88
|
+
end
|
89
|
+
puts errs.any? ? "\n*** #{errs.size} failures:\n\t#{errs.join("\n\t")}" : "\n*** #{combos.size > 1 ? 'all versions' : 'spec'} succeeded ***" unless o.dry_run
|
90
|
+
exit !errs.any?
|
data/schema_associations.gemspec
CHANGED
@@ -21,20 +21,11 @@ Gem::Specification.new do |s|
|
|
21
21
|
|
22
22
|
s.add_dependency("schema_plus")
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
s.add_development_dependency("rails", "~> 2.3")
|
27
|
-
when '3.0'
|
28
|
-
s.add_development_dependency("rails", "~> 3.0")
|
29
|
-
when '3.1'
|
30
|
-
s.add_development_dependency("rails", ">= 3.1.0.pre1")
|
31
|
-
end
|
32
|
-
|
33
|
-
s.add_development_dependency("rake", "~> 0.8.7")
|
24
|
+
s.add_development_dependency("rake")
|
25
|
+
s.add_development_dependency("rdoc")
|
34
26
|
s.add_development_dependency("rspec")
|
35
27
|
s.add_development_dependency("sqlite3")
|
36
28
|
s.add_development_dependency("simplecov")
|
37
29
|
s.add_development_dependency("simplecov-gem-adapter")
|
38
|
-
s.add_development_dependency("ruby-debug19") if RUBY_VERSION >= "1.9.2"
|
39
30
|
end
|
40
31
|
|
data/spec/association_spec.rb
CHANGED
@@ -17,17 +17,13 @@ describe ActiveRecord::Base do
|
|
17
17
|
class Comment < ActiveRecord::Base ; end
|
18
18
|
end
|
19
19
|
|
20
|
-
after(:each) do
|
21
|
-
Comment.destroy_all
|
22
|
-
Post.destroy_all
|
23
|
-
end
|
24
|
-
|
25
20
|
it "should create belongs_to association when reflecting on it" do
|
26
21
|
reflection = Comment.reflect_on_association(:post)
|
27
22
|
reflection.should_not be_nil
|
28
23
|
reflection.macro.should == :belongs_to
|
29
24
|
reflection.options[:class_name].should == "Post"
|
30
25
|
reflection.options[:foreign_key].should == "post_id"
|
26
|
+
reflection.options[:inverse_of].should == :comments
|
31
27
|
end
|
32
28
|
|
33
29
|
it "should create association when reflecting on all associations" do
|
@@ -36,6 +32,7 @@ describe ActiveRecord::Base do
|
|
36
32
|
reflection.macro.should == :belongs_to
|
37
33
|
reflection.options[:class_name].should == "Post"
|
38
34
|
reflection.options[:foreign_key].should == "post_id"
|
35
|
+
reflection.options[:inverse_of].should == :comments
|
39
36
|
end
|
40
37
|
|
41
38
|
it "should create association when accessing it" do
|
@@ -56,24 +53,10 @@ describe ActiveRecord::Base do
|
|
56
53
|
reflection.macro.should == :has_many
|
57
54
|
reflection.options[:class_name].should == "Comment"
|
58
55
|
reflection.options[:foreign_key].should == "post_id"
|
56
|
+
reflection.options[:inverse_of].should == :post
|
59
57
|
end
|
60
58
|
it "shouldn't raise an exception when model is instantiated" do
|
61
|
-
expect { Post.new }.
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should override auto_create negatively" do
|
66
|
-
with_associations_auto_create(true) do
|
67
|
-
create_tables(
|
68
|
-
"posts", {}, {},
|
69
|
-
"comments", {}, { :post_id => {} }
|
70
|
-
)
|
71
|
-
class Post < ActiveRecord::Base
|
72
|
-
schema_associations :auto_create => false
|
73
|
-
end
|
74
|
-
class Comment < ActiveRecord::Base ; end
|
75
|
-
Post.reflect_on_association(:comments).should be_nil
|
76
|
-
Comment.reflect_on_association(:post).should_not be_nil
|
59
|
+
expect { Post.new }.to_not raise_error
|
77
60
|
end
|
78
61
|
end
|
79
62
|
|
@@ -178,33 +161,51 @@ describe ActiveRecord::Base do
|
|
178
161
|
|
179
162
|
end
|
180
163
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
164
|
+
context "overrides" do
|
165
|
+
it "should override auto_create negatively" do
|
166
|
+
with_associations_auto_create(true) do
|
167
|
+
create_tables(
|
168
|
+
"posts", {}, {},
|
169
|
+
"comments", {}, { :post_id => {} }
|
170
|
+
)
|
171
|
+
class Post < ActiveRecord::Base
|
172
|
+
schema_associations :auto_create => false
|
173
|
+
end
|
174
|
+
class Comment < ActiveRecord::Base ; end
|
175
|
+
Post.reflect_on_association(:comments).should be_nil
|
176
|
+
Comment.reflect_on_association(:post).should_not be_nil
|
189
177
|
end
|
190
|
-
class Comment < ActiveRecord::Base ; end
|
191
|
-
Post.reflect_on_association(:comments).should_not be_nil
|
192
|
-
Comment.reflect_on_association(:post).should be_nil
|
193
178
|
end
|
194
|
-
end
|
195
179
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
180
|
+
|
181
|
+
it "should override auto_create positively explicitly" do
|
182
|
+
with_associations_auto_create(false) do
|
183
|
+
create_tables(
|
184
|
+
"posts", {}, {},
|
185
|
+
"comments", {}, { :post_id => {} }
|
186
|
+
)
|
187
|
+
class Post < ActiveRecord::Base
|
188
|
+
schema_associations :auto_create => true
|
189
|
+
end
|
190
|
+
class Comment < ActiveRecord::Base ; end
|
191
|
+
Post.reflect_on_association(:comments).should_not be_nil
|
192
|
+
Comment.reflect_on_association(:post).should be_nil
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
it "should override auto_create positively implicitly" do
|
197
|
+
with_associations_auto_create(false) do
|
198
|
+
create_tables(
|
199
|
+
"posts", {}, {},
|
200
|
+
"comments", {}, { :post_id => {} }
|
201
|
+
)
|
202
|
+
class Post < ActiveRecord::Base
|
203
|
+
schema_associations
|
204
|
+
end
|
205
|
+
class Comment < ActiveRecord::Base ; end
|
206
|
+
Post.reflect_on_association(:comments).should_not be_nil
|
207
|
+
Comment.reflect_on_association(:post).should be_nil
|
204
208
|
end
|
205
|
-
class Comment < ActiveRecord::Base ; end
|
206
|
-
Post.reflect_on_association(:comments).should_not be_nil
|
207
|
-
Comment.reflect_on_association(:post).should be_nil
|
208
209
|
end
|
209
210
|
end
|
210
211
|
|
@@ -224,6 +225,7 @@ describe ActiveRecord::Base do
|
|
224
225
|
reflection.macro.should == :has_one
|
225
226
|
reflection.options[:class_name].should == "Comment"
|
226
227
|
reflection.options[:foreign_key].should == "post_id"
|
228
|
+
reflection.options[:inverse_of].should == :post
|
227
229
|
end
|
228
230
|
end
|
229
231
|
|
@@ -242,6 +244,7 @@ describe ActiveRecord::Base do
|
|
242
244
|
reflection.macro.should == :belongs_to
|
243
245
|
reflection.options[:class_name].should == "Post"
|
244
246
|
reflection.options[:foreign_key].should == "subject_post_id"
|
247
|
+
reflection.options[:inverse_of].should == :comments_as_subject
|
245
248
|
end
|
246
249
|
|
247
250
|
it "should name has_many using 'as column'" do
|
@@ -250,6 +253,7 @@ describe ActiveRecord::Base do
|
|
250
253
|
reflection.macro.should == :has_many
|
251
254
|
reflection.options[:class_name].should == "Comment"
|
252
255
|
reflection.options[:foreign_key].should == "subject_post_id"
|
256
|
+
reflection.options[:inverse_of].should == :subject_post
|
253
257
|
end
|
254
258
|
end
|
255
259
|
|
@@ -268,6 +272,7 @@ describe ActiveRecord::Base do
|
|
268
272
|
reflection.macro.should == :belongs_to
|
269
273
|
reflection.options[:class_name].should == "Post"
|
270
274
|
reflection.options[:foreign_key].should == "post_cited"
|
275
|
+
reflection.options[:inverse_of].should == :comments_as_cited
|
271
276
|
end
|
272
277
|
|
273
278
|
it "should name has_many using 'as column'" do
|
@@ -276,6 +281,7 @@ describe ActiveRecord::Base do
|
|
276
281
|
reflection.macro.should == :has_many
|
277
282
|
reflection.options[:class_name].should == "Comment"
|
278
283
|
reflection.options[:foreign_key].should == "post_cited"
|
284
|
+
reflection.options[:inverse_of].should == :post_cited
|
279
285
|
end
|
280
286
|
end
|
281
287
|
|
@@ -294,6 +300,7 @@ describe ActiveRecord::Base do
|
|
294
300
|
reflection.macro.should == :belongs_to
|
295
301
|
reflection.options[:class_name].should == "Post"
|
296
302
|
reflection.options[:foreign_key].should == "subject"
|
303
|
+
reflection.options[:inverse_of].should == :comments_as_subject
|
297
304
|
end
|
298
305
|
|
299
306
|
it "should name has_many using 'as column'" do
|
@@ -302,6 +309,7 @@ describe ActiveRecord::Base do
|
|
302
309
|
reflection.macro.should == :has_many
|
303
310
|
reflection.options[:class_name].should == "Comment"
|
304
311
|
reflection.options[:foreign_key].should == "subject"
|
312
|
+
reflection.options[:inverse_of].should == :subject
|
305
313
|
end
|
306
314
|
end
|
307
315
|
|
@@ -321,6 +329,7 @@ describe ActiveRecord::Base do
|
|
321
329
|
reflection.macro.should == :has_many
|
322
330
|
reflection.options[:class_name].should == "Comment"
|
323
331
|
reflection.options[:foreign_key].should == "post_id"
|
332
|
+
reflection.options[:inverse_of].should == :post
|
324
333
|
reflection.options[:order].to_s.should == "position"
|
325
334
|
end
|
326
335
|
end
|
@@ -389,6 +398,7 @@ describe ActiveRecord::Base do
|
|
389
398
|
reflection.macro.should == :has_many
|
390
399
|
reflection.options[:class_name].should == "PostComment"
|
391
400
|
reflection.options[:foreign_key].should == "post_id"
|
401
|
+
reflection.options[:inverse_of].should == :post
|
392
402
|
end
|
393
403
|
end
|
394
404
|
|
@@ -400,6 +410,7 @@ describe ActiveRecord::Base do
|
|
400
410
|
reflection.macro.should == :has_many
|
401
411
|
reflection.options[:class_name].should == "CommentPost"
|
402
412
|
reflection.options[:foreign_key].should == "post_id"
|
413
|
+
reflection.options[:inverse_of].should == :post
|
403
414
|
end
|
404
415
|
end
|
405
416
|
|
@@ -411,6 +422,7 @@ describe ActiveRecord::Base do
|
|
411
422
|
reflection.macro.should == :has_many
|
412
423
|
reflection.options[:class_name].should == "BlogPageComment"
|
413
424
|
reflection.options[:foreign_key].should == "blog_page_post_id"
|
425
|
+
reflection.options[:inverse_of].should == :post
|
414
426
|
end
|
415
427
|
end
|
416
428
|
|
@@ -422,6 +434,7 @@ describe ActiveRecord::Base do
|
|
422
434
|
reflection.macro.should == :has_many
|
423
435
|
reflection.options[:class_name].should == "PostComment"
|
424
436
|
reflection.options[:foreign_key].should == "post_id"
|
437
|
+
reflection.options[:inverse_of].should == :post
|
425
438
|
reflection = Post.reflect_on_association(:comments)
|
426
439
|
reflection.should be_nil
|
427
440
|
end
|
@@ -435,6 +448,7 @@ describe ActiveRecord::Base do
|
|
435
448
|
reflection.macro.should == :has_many
|
436
449
|
reflection.options[:class_name].should == "PostComment"
|
437
450
|
reflection.options[:foreign_key].should == "post_id"
|
451
|
+
reflection.options[:inverse_of].should == :post
|
438
452
|
reflection = Post.reflect_on_association(:post_comments)
|
439
453
|
reflection.should be_nil
|
440
454
|
end
|
@@ -518,7 +532,7 @@ describe ActiveRecord::Base do
|
|
518
532
|
|
519
533
|
it "should define associations before needed by relation" do
|
520
534
|
Post.joins(:comments).all
|
521
|
-
expect { Post.joins(:comments).all }.
|
535
|
+
expect { Post.joins(:comments).all }.to_not raise_error
|
522
536
|
|
523
537
|
end
|
524
538
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,112 +1,148 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: schema_associations
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.2
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Ronen Barzel
|
9
|
-
-
|
9
|
+
- Michał Łomnicki
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
dependencies:
|
17
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2013-01-21 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
18
16
|
name: schema_plus
|
19
|
-
|
20
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
21
18
|
none: false
|
22
|
-
requirements:
|
23
|
-
- -
|
24
|
-
- !ruby/object:Gem::Version
|
25
|
-
version:
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0'
|
26
23
|
type: :runtime
|
27
|
-
version_requirements: *id001
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: rake
|
30
24
|
prerelease: false
|
31
|
-
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
32
26
|
none: false
|
33
|
-
requirements:
|
34
|
-
- -
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: 0
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
31
|
+
- !ruby/object:Gem::Dependency
|
32
|
+
name: rake
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
37
39
|
type: :development
|
38
|
-
version_requirements: *id002
|
39
|
-
- !ruby/object:Gem::Dependency
|
40
|
-
name: rspec
|
41
40
|
prerelease: false
|
42
|
-
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
42
|
none: false
|
44
|
-
requirements:
|
45
|
-
- -
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version:
|
43
|
+
requirements:
|
44
|
+
- - ! '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rdoc
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
48
55
|
type: :development
|
49
|
-
version_requirements: *id003
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: sqlite3
|
52
56
|
prerelease: false
|
53
|
-
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
58
|
none: false
|
55
|
-
requirements:
|
56
|
-
- -
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
version:
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: rspec
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
59
71
|
type: :development
|
60
|
-
version_requirements: *id004
|
61
|
-
- !ruby/object:Gem::Dependency
|
62
|
-
name: simplecov
|
63
72
|
prerelease: false
|
64
|
-
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
74
|
none: false
|
66
|
-
requirements:
|
67
|
-
- -
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
version:
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: sqlite3
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
70
87
|
type: :development
|
71
|
-
version_requirements: *id005
|
72
|
-
- !ruby/object:Gem::Dependency
|
73
|
-
name: simplecov-gem-adapter
|
74
88
|
prerelease: false
|
75
|
-
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: simplecov
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
76
98
|
none: false
|
77
|
-
requirements:
|
78
|
-
- -
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version:
|
99
|
+
requirements:
|
100
|
+
- - ! '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
81
103
|
type: :development
|
82
|
-
version_requirements: *id006
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: ruby-debug19
|
85
104
|
prerelease: false
|
86
|
-
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
87
106
|
none: false
|
88
|
-
requirements:
|
89
|
-
- -
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version:
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov-gem-adapter
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - ! '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
92
119
|
type: :development
|
93
|
-
|
94
|
-
|
95
|
-
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
123
|
+
requirements:
|
124
|
+
- - ! '>='
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
description: SchemaAssociations extends ActiveRecord to automatically create associations
|
128
|
+
by inspecting the database schema. This is more more DRY than the standard behavior,
|
129
|
+
for which in addition to specifying the foreign key in the migration, you must also
|
130
|
+
specify complementary associations in two model files (e.g. a :belongs_to and a
|
131
|
+
:has_many).
|
132
|
+
email:
|
96
133
|
- ronen@barzel.org
|
97
134
|
- michal.lomnicki@gmail.com
|
98
135
|
executables: []
|
99
|
-
|
100
136
|
extensions: []
|
101
|
-
|
102
137
|
extra_rdoc_files: []
|
103
|
-
|
104
|
-
files:
|
138
|
+
files:
|
105
139
|
- .gitignore
|
106
|
-
-
|
140
|
+
- .travis.yml
|
107
141
|
- MIT-LICENSE
|
108
142
|
- README.rdoc
|
109
143
|
- Rakefile
|
144
|
+
- gemfiles/Gemfile.rails-3.2
|
145
|
+
- gemfiles/Gemfile.rails-3.2.lock
|
110
146
|
- init.rb
|
111
147
|
- lib/schema_associations.rb
|
112
148
|
- lib/schema_associations/active_record/associations.rb
|
@@ -117,35 +153,33 @@ files:
|
|
117
153
|
- spec/association_spec.rb
|
118
154
|
- spec/connection.rb
|
119
155
|
- spec/spec_helper.rb
|
120
|
-
has_rdoc: true
|
121
156
|
homepage: https://github.com/lomba/schema_associations
|
122
157
|
licenses: []
|
123
|
-
|
124
158
|
post_install_message:
|
125
159
|
rdoc_options: []
|
126
|
-
|
127
|
-
require_paths:
|
160
|
+
require_paths:
|
128
161
|
- lib
|
129
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
162
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
130
163
|
none: false
|
131
|
-
requirements:
|
132
|
-
- -
|
133
|
-
- !ruby/object:Gem::Version
|
134
|
-
version:
|
135
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ! '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
169
|
none: false
|
137
|
-
requirements:
|
138
|
-
- -
|
139
|
-
- !ruby/object:Gem::Version
|
140
|
-
version:
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
141
174
|
requirements: []
|
142
|
-
|
143
175
|
rubyforge_project: schema_associations
|
144
|
-
rubygems_version: 1.
|
176
|
+
rubygems_version: 1.8.24
|
145
177
|
signing_key:
|
146
178
|
specification_version: 3
|
147
|
-
summary: ActiveRecord extension that automatically (DRY) creates associations based
|
148
|
-
|
179
|
+
summary: ActiveRecord extension that automatically (DRY) creates associations based
|
180
|
+
on the schema
|
181
|
+
test_files:
|
149
182
|
- spec/association_spec.rb
|
150
183
|
- spec/connection.rb
|
151
184
|
- spec/spec_helper.rb
|
185
|
+
has_rdoc:
|
data/Gemfile
DELETED