ar_outer_joins 0.1.0 → 0.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 +7 -0
- data/Appraisals +7 -0
- data/Gemfile +2 -0
- data/README.md +1 -1
- data/Rakefile +14 -0
- data/{ar_outer_joins.gemspec → ar_outer_join.gemspec} +1 -1
- data/gemfiles/ar3.2.gemfile +8 -0
- data/gemfiles/ar3.2.gemfile.lock +57 -0
- data/gemfiles/ar4.gemfile +8 -0
- data/gemfiles/ar4.gemfile.lock +65 -0
- data/lib/ar_outer_joins.rb +3 -1
- data/lib/ar_outer_joins/join.rb +9 -1
- data/lib/ar_outer_joins/join_builder.rb +5 -1
- data/lib/ar_outer_joins/version.rb +1 -1
- data/spec/outer_join_spec.rb +19 -11
- data/spec/spec_helper.rb +4 -0
- metadata +42 -27
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b08109bce18501fcb96033fa12ba0233f2fa185c
|
4
|
+
data.tar.gz: ab591b631e058e82c867d026712e7fbf389cb39b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 703f36b3498b00aa953c2133e915923267911fa5aaacef7de096842b1a58f1fb89b2b09f2d8b880b4fcf3a6b4abb1297ef0135b5f242d36e3f4ee877f5935460
|
7
|
+
data.tar.gz: 5417ff4dd08024915f596eb70c9646158d125119553951d7397b91ff7ea3d2419d90fdb5ad1f884cd29da3f4033acf4172a9c5fafc1dddc51c5bd02f18b42425
|
data/Appraisals
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -1,2 +1,16 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
require "rubygems"
|
4
|
+
require "bundler/setup"
|
5
|
+
require "appraisal"
|
6
|
+
require "rspec/core/rake_task"
|
7
|
+
|
2
8
|
require "bundler/gem_tasks"
|
9
|
+
|
10
|
+
desc "Run all examples"
|
11
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
12
|
+
#t.rspec_path = 'bin/rspec'
|
13
|
+
t.rspec_opts = %w[--color]
|
14
|
+
end
|
15
|
+
|
16
|
+
task :default => :spec
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = ArOuterJoins::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency "activerecord", "
|
18
|
+
gem.add_dependency "activerecord", ">=3.2"
|
19
19
|
gem.add_development_dependency "rspec"
|
20
20
|
gem.add_development_dependency "sqlite3"
|
21
21
|
gem.add_development_dependency "pry"
|
@@ -0,0 +1,57 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/dev/Projects/ar_outer_joins
|
3
|
+
specs:
|
4
|
+
ar_outer_joins (0.0.1)
|
5
|
+
activerecord (>= 3.2)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (3.2.12)
|
11
|
+
activesupport (= 3.2.12)
|
12
|
+
builder (~> 3.0.0)
|
13
|
+
activerecord (3.2.12)
|
14
|
+
activemodel (= 3.2.12)
|
15
|
+
activesupport (= 3.2.12)
|
16
|
+
arel (~> 3.0.2)
|
17
|
+
tzinfo (~> 0.3.29)
|
18
|
+
activesupport (3.2.12)
|
19
|
+
i18n (~> 0.6)
|
20
|
+
multi_json (~> 1.0)
|
21
|
+
appraisal (0.5.1)
|
22
|
+
bundler
|
23
|
+
rake
|
24
|
+
arel (3.0.2)
|
25
|
+
builder (3.0.4)
|
26
|
+
coderay (1.0.9)
|
27
|
+
diff-lcs (1.2.1)
|
28
|
+
i18n (0.6.4)
|
29
|
+
method_source (0.8.1)
|
30
|
+
multi_json (1.6.1)
|
31
|
+
pry (0.9.12)
|
32
|
+
coderay (~> 1.0.5)
|
33
|
+
method_source (~> 0.8)
|
34
|
+
slop (~> 3.4)
|
35
|
+
rake (10.0.3)
|
36
|
+
rspec (2.13.0)
|
37
|
+
rspec-core (~> 2.13.0)
|
38
|
+
rspec-expectations (~> 2.13.0)
|
39
|
+
rspec-mocks (~> 2.13.0)
|
40
|
+
rspec-core (2.13.0)
|
41
|
+
rspec-expectations (2.13.0)
|
42
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
43
|
+
rspec-mocks (2.13.0)
|
44
|
+
slop (3.4.3)
|
45
|
+
sqlite3 (1.3.7)
|
46
|
+
tzinfo (0.3.36)
|
47
|
+
|
48
|
+
PLATFORMS
|
49
|
+
ruby
|
50
|
+
|
51
|
+
DEPENDENCIES
|
52
|
+
activerecord (~> 3.2.0)
|
53
|
+
appraisal
|
54
|
+
ar_outer_joins!
|
55
|
+
pry
|
56
|
+
rspec
|
57
|
+
sqlite3
|
@@ -0,0 +1,65 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/dev/Projects/ar_outer_joins
|
3
|
+
specs:
|
4
|
+
ar_outer_joins (0.0.1)
|
5
|
+
activerecord (>= 3.2)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (4.0.0.beta1)
|
11
|
+
activesupport (= 4.0.0.beta1)
|
12
|
+
builder (~> 3.1.0)
|
13
|
+
activerecord (4.0.0.beta1)
|
14
|
+
activemodel (= 4.0.0.beta1)
|
15
|
+
activerecord-deprecated_finders (~> 0.0.3)
|
16
|
+
activesupport (= 4.0.0.beta1)
|
17
|
+
arel (~> 4.0.0.beta1)
|
18
|
+
activerecord-deprecated_finders (0.0.3)
|
19
|
+
activesupport (4.0.0.beta1)
|
20
|
+
i18n (~> 0.6.2)
|
21
|
+
minitest (~> 4.2)
|
22
|
+
multi_json (~> 1.3)
|
23
|
+
thread_safe (~> 0.1)
|
24
|
+
tzinfo (~> 0.3.33)
|
25
|
+
appraisal (0.5.1)
|
26
|
+
bundler
|
27
|
+
rake
|
28
|
+
arel (4.0.0.beta1)
|
29
|
+
atomic (1.0.1)
|
30
|
+
builder (3.1.4)
|
31
|
+
coderay (1.0.9)
|
32
|
+
diff-lcs (1.2.1)
|
33
|
+
i18n (0.6.4)
|
34
|
+
method_source (0.8.1)
|
35
|
+
minitest (4.6.2)
|
36
|
+
multi_json (1.6.1)
|
37
|
+
pry (0.9.12)
|
38
|
+
coderay (~> 1.0.5)
|
39
|
+
method_source (~> 0.8)
|
40
|
+
slop (~> 3.4)
|
41
|
+
rake (10.0.3)
|
42
|
+
rspec (2.13.0)
|
43
|
+
rspec-core (~> 2.13.0)
|
44
|
+
rspec-expectations (~> 2.13.0)
|
45
|
+
rspec-mocks (~> 2.13.0)
|
46
|
+
rspec-core (2.13.0)
|
47
|
+
rspec-expectations (2.13.0)
|
48
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
49
|
+
rspec-mocks (2.13.0)
|
50
|
+
slop (3.4.3)
|
51
|
+
sqlite3 (1.3.7)
|
52
|
+
thread_safe (0.1.0)
|
53
|
+
atomic
|
54
|
+
tzinfo (0.3.36)
|
55
|
+
|
56
|
+
PLATFORMS
|
57
|
+
ruby
|
58
|
+
|
59
|
+
DEPENDENCIES
|
60
|
+
activerecord (= 4.0.0.beta1)
|
61
|
+
appraisal
|
62
|
+
ar_outer_joins!
|
63
|
+
pry
|
64
|
+
rspec
|
65
|
+
sqlite3
|
data/lib/ar_outer_joins.rb
CHANGED
@@ -8,7 +8,9 @@ module ArOuterJoins
|
|
8
8
|
association_joins, regular_joins = joins.partition do |join|
|
9
9
|
join.is_a?(Hash) or join.is_a?(Array) or join.is_a?(Symbol)
|
10
10
|
end
|
11
|
-
Join.new(self).apply(*association_joins)
|
11
|
+
join_set = Join.new(self).apply(*association_joins)
|
12
|
+
join_set = join_set.joins(*regular_joins) unless regular_joins.empty?
|
13
|
+
join_set
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
data/lib/ar_outer_joins/join.rb
CHANGED
@@ -20,7 +20,15 @@ module ArOuterJoins
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def apply(*args)
|
23
|
-
klass.
|
23
|
+
scope = if klass.all.is_a?(ActiveRecord::Relation) then klass.all else klass.scoped end
|
24
|
+
joins = scope.joins_values.select.map { |j| j.to_sql if j.respond_to?(:to_sql) }
|
25
|
+
generate(*args).flatten.inject(scope) do |scope, join|
|
26
|
+
if joins.include?(join.to_sql)
|
27
|
+
scope
|
28
|
+
else
|
29
|
+
scope.joins(join)
|
30
|
+
end
|
31
|
+
end
|
24
32
|
end
|
25
33
|
end
|
26
34
|
end
|
@@ -24,7 +24,11 @@ module ArOuterJoins
|
|
24
24
|
on = Arel::Nodes::On.new(table[association.foreign_key].eq(joined_table[primary_key]))
|
25
25
|
[Arel::Nodes::OuterJoin.new(joined_table, on)]
|
26
26
|
when :has_and_belongs_to_many
|
27
|
-
join_model_table =
|
27
|
+
join_model_table = if association.respond_to?(:join_table)
|
28
|
+
Arel::Table.new(association.join_table)
|
29
|
+
else
|
30
|
+
Arel::Table.new(association.options[:join_table])
|
31
|
+
end
|
28
32
|
joined_primary_key = association.klass.primary_key
|
29
33
|
|
30
34
|
on1 = Arel::Nodes::On.new(join_model_table[association.foreign_key].eq(table[primary_key]))
|
data/spec/outer_join_spec.rb
CHANGED
@@ -39,7 +39,7 @@ describe ActiveRecord::Base do
|
|
39
39
|
product2 = Product.create! :category => category2
|
40
40
|
product3 = Product.create! :published => true
|
41
41
|
query = Product.outer_joins(:category).where("categories.name = ? OR products.published = ?", "Shirts", true)
|
42
|
-
query.
|
42
|
+
query.to_a.should =~ [product2, product3]
|
43
43
|
end
|
44
44
|
|
45
45
|
it "joins several associations" do
|
@@ -51,7 +51,7 @@ describe ActiveRecord::Base do
|
|
51
51
|
product3 = Product.create! :published => true
|
52
52
|
product4 = Product.create! :site => site1
|
53
53
|
query = Product.outer_joins(:category, :site).where("sites.name = ? OR categories.name = ? OR products.published = ?", "Elabs", "Shirts", true)
|
54
|
-
query.
|
54
|
+
query.to_a.should =~ [product2, product3, product4]
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -66,7 +66,7 @@ describe ActiveRecord::Base do
|
|
66
66
|
Image.create! :product => product2
|
67
67
|
|
68
68
|
query = Product.outer_joins(:image).where("images.highres = ? OR products.published = ?", true, true)
|
69
|
-
query.
|
69
|
+
query.to_a.should =~ [product1, product3]
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -81,7 +81,7 @@ describe ActiveRecord::Base do
|
|
81
81
|
LineItem.create! :product => product2
|
82
82
|
|
83
83
|
query = Product.outer_joins(:line_items).where("line_items.price = ? OR products.published = ?", 4, true)
|
84
|
-
query.
|
84
|
+
query.to_a.should =~ [product1, product3]
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -97,7 +97,7 @@ describe ActiveRecord::Base do
|
|
97
97
|
|
98
98
|
|
99
99
|
query = Product.outer_joins(:tags).where("tags.name = ? OR products.published = ?", "Red", true)
|
100
|
-
query.
|
100
|
+
query.to_a.should =~ [product2, product3, product4]
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
@@ -116,7 +116,7 @@ describe ActiveRecord::Base do
|
|
116
116
|
LineItem.create! :product => product3
|
117
117
|
|
118
118
|
query = Product.outer_joins(:baskets).where("baskets.purchased = ? OR products.published = ?", true, true)
|
119
|
-
query.
|
119
|
+
query.to_a.should =~ [product1, product3]
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
@@ -135,7 +135,7 @@ describe ActiveRecord::Base do
|
|
135
135
|
LineItem.create! :product => product3
|
136
136
|
|
137
137
|
query = Product.outer_joins(:line_items => :basket).where("baskets.purchased = ? OR products.published = ?", true, true)
|
138
|
-
query.
|
138
|
+
query.to_a.should =~ [product1, product3]
|
139
139
|
end
|
140
140
|
|
141
141
|
it "allows hashes with arrays" do
|
@@ -154,7 +154,15 @@ describe ActiveRecord::Base do
|
|
154
154
|
Discount.create! :line_item => line_item3, :percentage => 80
|
155
155
|
|
156
156
|
query = Product.outer_joins(:line_items => [:basket, :discounts]).where("baskets.purchased = ? OR products.published = ? OR discounts.percentage > ?", true, true, 50)
|
157
|
-
query.
|
157
|
+
query.to_a.should =~ [product1, product3, product4]
|
158
|
+
end
|
159
|
+
|
160
|
+
it "does not perform join more than once" do
|
161
|
+
query = Product.outer_joins(:line_items => [:basket, :discounts]).outer_joins("INNER JOIN images ON products.id = images.product_id")
|
162
|
+
query = query.outer_joins(:line_items => [:discounts])
|
163
|
+
query = query.outer_joins(:line_items)
|
164
|
+
query = query.outer_joins(:line_items => :basket)
|
165
|
+
query.to_a.should be_empty
|
158
166
|
end
|
159
167
|
end
|
160
168
|
|
@@ -167,7 +175,7 @@ describe ActiveRecord::Base do
|
|
167
175
|
product3 = Product.create! :published => true
|
168
176
|
query = Product.outer_joins("LEFT OUTER JOIN categories ON products.category_id = categories.id")
|
169
177
|
query = query.where("categories.name = ? OR products.published = ?", "Shirts", true)
|
170
|
-
query.
|
178
|
+
query.to_a.should =~ [product2, product3]
|
171
179
|
end
|
172
180
|
|
173
181
|
it "allows multiple joins" do
|
@@ -178,7 +186,7 @@ describe ActiveRecord::Base do
|
|
178
186
|
product3 = Product.create! :published => true
|
179
187
|
query = Product.outer_joins(:line_items, "LEFT OUTER JOIN categories ON products.category_id = categories.id")
|
180
188
|
query = query.where("categories.name = ? OR products.published = ?", "Shirts", true)
|
181
|
-
query.
|
189
|
+
query.to_a.should =~ [product2, product3]
|
182
190
|
end
|
183
191
|
|
184
192
|
it "allows arel joins" do
|
@@ -193,7 +201,7 @@ describe ActiveRecord::Base do
|
|
193
201
|
|
194
202
|
query = Product.outer_joins(join)
|
195
203
|
query = query.where("categories.name = ? OR products.published = ?", "Shirts", true)
|
196
|
-
query.
|
204
|
+
query.to_a.should =~ [product2, product3]
|
197
205
|
end
|
198
206
|
end
|
199
207
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -48,6 +48,10 @@ ActiveRecord::Base.connection.create_table :images do |t|
|
|
48
48
|
end
|
49
49
|
|
50
50
|
RSpec.configure do |config|
|
51
|
+
config.expect_with :rspec do |c|
|
52
|
+
c.syntax = [:should, :expect]
|
53
|
+
end
|
54
|
+
|
51
55
|
config.around do |example|
|
52
56
|
ActiveRecord::Base.transaction do
|
53
57
|
example.run
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_outer_joins
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jonas Nicklas
|
@@ -10,52 +9,64 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2014-09-08 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: activerecord
|
17
|
-
requirement:
|
18
|
-
none: false
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
19
17
|
requirements:
|
20
|
-
- -
|
18
|
+
- - ">="
|
21
19
|
- !ruby/object:Gem::Version
|
22
20
|
version: '3.2'
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
|
-
version_requirements:
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '3.2'
|
26
28
|
- !ruby/object:Gem::Dependency
|
27
29
|
name: rspec
|
28
|
-
requirement:
|
29
|
-
none: false
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- -
|
32
|
+
- - ">="
|
32
33
|
- !ruby/object:Gem::Version
|
33
34
|
version: '0'
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
|
-
version_requirements:
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
37
42
|
- !ruby/object:Gem::Dependency
|
38
43
|
name: sqlite3
|
39
|
-
requirement:
|
40
|
-
none: false
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
41
45
|
requirements:
|
42
|
-
- -
|
46
|
+
- - ">="
|
43
47
|
- !ruby/object:Gem::Version
|
44
48
|
version: '0'
|
45
49
|
type: :development
|
46
50
|
prerelease: false
|
47
|
-
version_requirements:
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
48
56
|
- !ruby/object:Gem::Dependency
|
49
57
|
name: pry
|
50
|
-
requirement:
|
51
|
-
none: false
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
52
59
|
requirements:
|
53
|
-
- -
|
60
|
+
- - ">="
|
54
61
|
- !ruby/object:Gem::Version
|
55
62
|
version: '0'
|
56
63
|
type: :development
|
57
64
|
prerelease: false
|
58
|
-
version_requirements:
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
59
70
|
description: Adds the missing outer_joins method to ActiveRecord
|
60
71
|
email:
|
61
72
|
- jonas.nicklas@gmail.com
|
@@ -64,11 +75,16 @@ executables: []
|
|
64
75
|
extensions: []
|
65
76
|
extra_rdoc_files: []
|
66
77
|
files:
|
67
|
-
- .gitignore
|
78
|
+
- ".gitignore"
|
79
|
+
- Appraisals
|
68
80
|
- Gemfile
|
69
81
|
- README.md
|
70
82
|
- Rakefile
|
71
|
-
-
|
83
|
+
- ar_outer_join.gemspec
|
84
|
+
- gemfiles/ar3.2.gemfile
|
85
|
+
- gemfiles/ar3.2.gemfile.lock
|
86
|
+
- gemfiles/ar4.gemfile
|
87
|
+
- gemfiles/ar4.gemfile.lock
|
72
88
|
- lib/ar_outer_joins.rb
|
73
89
|
- lib/ar_outer_joins/join.rb
|
74
90
|
- lib/ar_outer_joins/join_builder.rb
|
@@ -77,27 +93,26 @@ files:
|
|
77
93
|
- spec/spec_helper.rb
|
78
94
|
homepage: http://github.com/elabs/ar_outer_joins
|
79
95
|
licenses: []
|
96
|
+
metadata: {}
|
80
97
|
post_install_message:
|
81
98
|
rdoc_options: []
|
82
99
|
require_paths:
|
83
100
|
- lib
|
84
101
|
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
-
none: false
|
86
102
|
requirements:
|
87
|
-
- -
|
103
|
+
- - ">="
|
88
104
|
- !ruby/object:Gem::Version
|
89
105
|
version: '0'
|
90
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
-
none: false
|
92
107
|
requirements:
|
93
|
-
- -
|
108
|
+
- - ">="
|
94
109
|
- !ruby/object:Gem::Version
|
95
110
|
version: '0'
|
96
111
|
requirements: []
|
97
112
|
rubyforge_project:
|
98
|
-
rubygems_version:
|
113
|
+
rubygems_version: 2.2.2
|
99
114
|
signing_key:
|
100
|
-
specification_version:
|
115
|
+
specification_version: 4
|
101
116
|
summary: outer_joins for ActiveRecord
|
102
117
|
test_files:
|
103
118
|
- spec/outer_join_spec.rb
|