arel-helpers 2.5.0 → 2.6.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 +5 -5
- data/Gemfile +4 -2
- data/Rakefile +2 -2
- data/lib/arel-helpers/aliases.rb +21 -0
- data/lib/arel-helpers/join_association.rb +33 -9
- data/lib/arel-helpers/version.rb +1 -1
- data/lib/arel-helpers.rb +2 -1
- data/spec/aliases_spec.rb +42 -0
- data/spec/env/models.rb +5 -0
- data/spec/env.rb +1 -1
- data/spec/join_association_spec.rb +16 -0
- data/spec/spec_helper.rb +1 -1
- metadata +5 -4
- data/History.txt +0 -49
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c660ae1fe4060cdb950996cc25907f683ccc785701c7cebd7c80bd426a3bb9ea
|
4
|
+
data.tar.gz: 2496cce6af26bb6c243e1947e32b800cb84b9bc3bdc134f59e3c2480521eb5f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 397035a79ac5c8d9ec98858d76e028dc421d247d8c342131b4ca7b1e8bcd790698ed6400fca56ca1769785cb7dfa9a15aeae1fe0b765f7092b367c98ed5e5879
|
7
|
+
data.tar.gz: 302f2730474bd9f929f36ee9bc10a91b13cd904ccce6963bb072de61b1c21f0526ea0221e3637f4cc10745d47e9e21fb140e100ee7482eafd2b19b463062227a
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ require './lib/arel-helpers'
|
|
10
10
|
|
11
11
|
Bundler::GemHelper.install_tasks
|
12
12
|
|
13
|
-
task :
|
13
|
+
task default: :spec
|
14
14
|
|
15
15
|
desc 'Run specs'
|
16
16
|
RSpec::Core::RakeTask.new do |t|
|
@@ -21,7 +21,7 @@ task :console do
|
|
21
21
|
$:.push(File.dirname(__FILE__))
|
22
22
|
|
23
23
|
require 'spec/env'
|
24
|
-
require 'pry-
|
24
|
+
require 'pry-byebug'
|
25
25
|
|
26
26
|
ArelHelpers::Env.establish_connection
|
27
27
|
ArelHelpers::Env.reset
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module ArelHelpers
|
4
|
+
|
5
|
+
module Aliases
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
def aliased_as(*args)
|
10
|
+
aliases = args.map { |name| arel_table.alias(name) }
|
11
|
+
|
12
|
+
if block_given?
|
13
|
+
yield *aliases
|
14
|
+
else
|
15
|
+
aliases
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -17,21 +17,22 @@ module ArelHelpers
|
|
17
17
|
# For example, for HABTM associations, two join statements are required.
|
18
18
|
# This method encapsulates that functionality and yields an intermediate object for chaining.
|
19
19
|
# It also allows you to use an outer join instead of the default inner via the join_type arg.
|
20
|
-
def join_association(table, association, join_type = Arel::Nodes::InnerJoin, &block)
|
20
|
+
def join_association(table, association, join_type = Arel::Nodes::InnerJoin, options = {}, &block)
|
21
21
|
if ActiveRecord::VERSION::STRING >= '5.0.0'
|
22
|
-
join_association_5_0(table, association, join_type, &block)
|
22
|
+
join_association_5_0(table, association, join_type, options, &block)
|
23
23
|
elsif ActiveRecord::VERSION::STRING >= '4.2.0'
|
24
|
-
join_association_4_2(table, association, join_type, &block)
|
24
|
+
join_association_4_2(table, association, join_type, options, &block)
|
25
25
|
elsif ActiveRecord::VERSION::STRING >= '4.1.0'
|
26
|
-
join_association_4_1(table, association, join_type, &block)
|
26
|
+
join_association_4_1(table, association, join_type, options, &block)
|
27
27
|
else
|
28
|
-
join_association_3_1(table, association, join_type, &block)
|
28
|
+
join_association_3_1(table, association, join_type, options, &block)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
private
|
33
33
|
|
34
|
-
def join_association_3_1(table, association, join_type)
|
34
|
+
def join_association_3_1(table, association, join_type, options = {})
|
35
|
+
aliases = options.fetch(:aliases, {})
|
35
36
|
associations = association.is_a?(Array) ? association : [association]
|
36
37
|
join_dependency = ActiveRecord::Associations::JoinDependency.new(table, associations, [])
|
37
38
|
manager = Arel::SelectManager.new(table)
|
@@ -42,6 +43,10 @@ module ArelHelpers
|
|
42
43
|
end
|
43
44
|
|
44
45
|
manager.join_sources.map do |assoc|
|
46
|
+
if found_alias = find_alias(assoc.left.name, aliases)
|
47
|
+
assoc.left.table_alias = found_alias.name
|
48
|
+
end
|
49
|
+
|
45
50
|
if block_given?
|
46
51
|
# yield |assoc_name, join_conditions|
|
47
52
|
right = yield assoc.left.name.to_sym, assoc.right
|
@@ -52,7 +57,8 @@ module ArelHelpers
|
|
52
57
|
end
|
53
58
|
end
|
54
59
|
|
55
|
-
def join_association_4_1(table, association, join_type)
|
60
|
+
def join_association_4_1(table, association, join_type, options = {})
|
61
|
+
aliases = options.fetch(:aliases, {})
|
56
62
|
associations = association.is_a?(Array) ? association : [association]
|
57
63
|
join_dependency = ActiveRecord::Associations::JoinDependency.new(table, associations, [])
|
58
64
|
|
@@ -63,6 +69,10 @@ module ArelHelpers
|
|
63
69
|
constraint.right
|
64
70
|
end
|
65
71
|
|
72
|
+
if found_alias = find_alias(constraint.left.name, aliases)
|
73
|
+
constraint.left.table_alias = found_alias.name
|
74
|
+
end
|
75
|
+
|
66
76
|
join_type.new(constraint.left, right)
|
67
77
|
end
|
68
78
|
end
|
@@ -72,7 +82,8 @@ module ArelHelpers
|
|
72
82
|
# join_association isn't able to add to the list of bind variables
|
73
83
|
# dynamically. To get around the problem, this method must return
|
74
84
|
# a string.
|
75
|
-
def join_association_4_2(table, association, join_type)
|
85
|
+
def join_association_4_2(table, association, join_type, options = {})
|
86
|
+
aliases = options.fetch(:aliases, [])
|
76
87
|
associations = association.is_a?(Array) ? association : [association]
|
77
88
|
join_dependency = ActiveRecord::Associations::JoinDependency.new(table, associations, [])
|
78
89
|
|
@@ -90,6 +101,10 @@ module ArelHelpers
|
|
90
101
|
join.right
|
91
102
|
end
|
92
103
|
|
104
|
+
if found_alias = find_alias(join.left.name, aliases)
|
105
|
+
join.left.table_alias = found_alias.name
|
106
|
+
end
|
107
|
+
|
93
108
|
join_type.new(join.left, right)
|
94
109
|
end
|
95
110
|
end
|
@@ -101,7 +116,8 @@ module ArelHelpers
|
|
101
116
|
join_strings.join(' ')
|
102
117
|
end
|
103
118
|
|
104
|
-
def join_association_5_0(table, association, join_type)
|
119
|
+
def join_association_5_0(table, association, join_type, options = {})
|
120
|
+
aliases = options.fetch(:aliases, [])
|
105
121
|
associations = association.is_a?(Array) ? association : [association]
|
106
122
|
join_dependency = ActiveRecord::Associations::JoinDependency.new(table, associations, [])
|
107
123
|
|
@@ -120,6 +136,10 @@ module ArelHelpers
|
|
120
136
|
join.right
|
121
137
|
end
|
122
138
|
|
139
|
+
if found_alias = find_alias(join.left.name, aliases)
|
140
|
+
join.left.table_alias = found_alias.name
|
141
|
+
end
|
142
|
+
|
123
143
|
join_type.new(join.left, right)
|
124
144
|
end
|
125
145
|
end
|
@@ -138,6 +158,10 @@ module ArelHelpers
|
|
138
158
|
collect = visitor.accept(node, Arel::Collectors::Bind.new)
|
139
159
|
collect.substitute_binds(binds).join
|
140
160
|
end
|
161
|
+
|
162
|
+
def find_alias(name, aliases)
|
163
|
+
aliases.find { |a| a.table_name == name }
|
164
|
+
end
|
141
165
|
end
|
142
166
|
end
|
143
167
|
end
|
data/lib/arel-helpers/version.rb
CHANGED
data/lib/arel-helpers.rb
CHANGED
@@ -17,8 +17,9 @@ rescue
|
|
17
17
|
end
|
18
18
|
|
19
19
|
module ArelHelpers
|
20
|
-
autoload :
|
20
|
+
autoload :Aliases, "arel-helpers/aliases"
|
21
21
|
autoload :ArelTable, "arel-helpers/arel_table"
|
22
|
+
autoload :JoinAssociation, "arel-helpers/join_association"
|
22
23
|
autoload :QueryBuilder, "arel-helpers/query_builder"
|
23
24
|
|
24
25
|
def self.join_association(*args, &block)
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe ArelHelpers::Aliases do
|
6
|
+
describe "#aliased_as" do
|
7
|
+
it "yields an alias when passed a block" do
|
8
|
+
Post.aliased_as('foo') do |foo_alias|
|
9
|
+
expect(foo_alias).to be_a(Arel::Nodes::TableAlias)
|
10
|
+
expect(foo_alias.name).to eq('foo')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it "is capable of yielding multiple aliases" do
|
15
|
+
Post.aliased_as('foo', 'bar') do |foo_alias, bar_alias|
|
16
|
+
expect(foo_alias).to be_a(Arel::Nodes::TableAlias)
|
17
|
+
expect(foo_alias.name).to eq('foo')
|
18
|
+
|
19
|
+
expect(bar_alias).to be_a(Arel::Nodes::TableAlias)
|
20
|
+
expect(bar_alias.name).to eq('bar')
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns an alias when not passed a block" do
|
25
|
+
aliases = Post.aliased_as('foo')
|
26
|
+
expect(aliases.size).to eq(1)
|
27
|
+
expect(aliases[0]).to be_a(Arel::Nodes::TableAlias)
|
28
|
+
expect(aliases[0].name).to eq('foo')
|
29
|
+
end
|
30
|
+
|
31
|
+
it "is capable of returning multiple aliases" do
|
32
|
+
aliases = Post.aliased_as('foo', 'bar')
|
33
|
+
expect(aliases.size).to eq(2)
|
34
|
+
|
35
|
+
expect(aliases[0]).to be_a(Arel::Nodes::TableAlias)
|
36
|
+
expect(aliases[0].name).to eq('foo')
|
37
|
+
|
38
|
+
expect(aliases[1]).to be_a(Arel::Nodes::TableAlias)
|
39
|
+
expect(aliases[1].name).to eq('bar')
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/spec/env/models.rb
CHANGED
@@ -2,29 +2,34 @@
|
|
2
2
|
|
3
3
|
class Post < ActiveRecord::Base
|
4
4
|
include ArelHelpers::ArelTable
|
5
|
+
include ArelHelpers::Aliases
|
5
6
|
has_many :comments
|
6
7
|
has_many :favorites
|
7
8
|
end
|
8
9
|
|
9
10
|
class Comment < ActiveRecord::Base
|
10
11
|
include ArelHelpers::ArelTable
|
12
|
+
include ArelHelpers::Aliases
|
11
13
|
belongs_to :post
|
12
14
|
belongs_to :author
|
13
15
|
end
|
14
16
|
|
15
17
|
class Author < ActiveRecord::Base
|
16
18
|
include ArelHelpers::ArelTable
|
19
|
+
include ArelHelpers::Aliases
|
17
20
|
has_one :comment
|
18
21
|
has_and_belongs_to_many :collab_posts
|
19
22
|
end
|
20
23
|
|
21
24
|
class Favorite < ActiveRecord::Base
|
22
25
|
include ArelHelpers::ArelTable
|
26
|
+
include ArelHelpers::Aliases
|
23
27
|
belongs_to :post
|
24
28
|
end
|
25
29
|
|
26
30
|
class CollabPost < ActiveRecord::Base
|
27
31
|
include ArelHelpers::ArelTable
|
32
|
+
include ArelHelpers::Aliases
|
28
33
|
has_and_belongs_to_many :authors
|
29
34
|
end
|
30
35
|
|
data/spec/env.rb
CHANGED
@@ -65,6 +65,22 @@ describe ArelHelpers do
|
|
65
65
|
'SELECT "collab_posts".* FROM "collab_posts" INNER JOIN "authors_collab_posts" ON "authors_collab_posts"."collab_post_id" = "collab_posts"."id" INNER JOIN "authors" ON "authors"."id" = "authors_collab_posts"."author_id"'
|
66
66
|
end
|
67
67
|
|
68
|
+
it "allows adding a custom alias to the joined table" do
|
69
|
+
Comment.aliased_as(:foo) do |foo|
|
70
|
+
Post.joins(ArelHelpers.join_association(Post, :comments, Arel::Nodes::InnerJoin, aliases: [foo])).to_sql.should ==
|
71
|
+
'SELECT "posts".* FROM "posts" INNER JOIN "comments" "foo" ON "foo"."post_id" = "posts"."id"'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it "allows aliasing multiple associations" do
|
76
|
+
Comment.aliased_as(:foo) do |foo|
|
77
|
+
Favorite.aliased_as(:bar) do |bar|
|
78
|
+
Post.joins(ArelHelpers.join_association(Post, [:comments, :favorites], Arel::Nodes::InnerJoin, aliases: [foo, bar])).to_sql.should ==
|
79
|
+
'SELECT "posts".* FROM "posts" INNER JOIN "comments" "foo" ON "foo"."post_id" = "posts"."id" INNER JOIN "favorites" "bar" ON "bar"."post_id" = "posts"."id"'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
68
84
|
it 'handles polymorphic through associations' do
|
69
85
|
relation = Location.joins(
|
70
86
|
ArelHelpers.join_association(Location, :community_tickets)
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: arel-helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cameron Dutro
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -39,16 +39,17 @@ extensions: []
|
|
39
39
|
extra_rdoc_files: []
|
40
40
|
files:
|
41
41
|
- Gemfile
|
42
|
-
- History.txt
|
43
42
|
- README.md
|
44
43
|
- Rakefile
|
45
44
|
- arel-helpers.gemspec
|
46
45
|
- lib/arel-helpers.rb
|
46
|
+
- lib/arel-helpers/aliases.rb
|
47
47
|
- lib/arel-helpers/arel_table.rb
|
48
48
|
- lib/arel-helpers/ext/collection_proxy.rb
|
49
49
|
- lib/arel-helpers/join_association.rb
|
50
50
|
- lib/arel-helpers/query_builder.rb
|
51
51
|
- lib/arel-helpers/version.rb
|
52
|
+
- spec/aliases_spec.rb
|
52
53
|
- spec/arel_table_spec.rb
|
53
54
|
- spec/env.rb
|
54
55
|
- spec/env/migrations.rb
|
@@ -76,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
77
|
version: '0'
|
77
78
|
requirements: []
|
78
79
|
rubyforge_project:
|
79
|
-
rubygems_version: 2.
|
80
|
+
rubygems_version: 2.7.3
|
80
81
|
signing_key:
|
81
82
|
specification_version: 4
|
82
83
|
summary: Useful tools to help construct database queries with ActiveRecord and Arel.
|
data/History.txt
DELETED
@@ -1,49 +0,0 @@
|
|
1
|
-
== 1.0.0
|
2
|
-
|
3
|
-
* Birthday! Includes join_association and arel_table helpers.
|
4
|
-
|
5
|
-
== 1.1.0
|
6
|
-
|
7
|
-
* Adding the QueryBuilder class.
|
8
|
-
|
9
|
-
== 1.2.0
|
10
|
-
|
11
|
-
* Adding Rails 4 support.
|
12
|
-
|
13
|
-
== 2.0.0
|
14
|
-
|
15
|
-
* Turning JoinAssociation into an ActiveSupport::Concern (breaks backwards compatibility).
|
16
|
-
|
17
|
-
== 2.0.1
|
18
|
-
|
19
|
-
* Define ArelHelpers.join_association so people can use join_association functionality without relying on autoloading. (@peeja, github issue #8)
|
20
|
-
|
21
|
-
== 2.0.2
|
22
|
-
|
23
|
-
* Fix issue causing CollectionProxy#[] to return Arel::Attribute objects instead of model instances. See https://github.com/camertron/arel-helpers/pull/11
|
24
|
-
|
25
|
-
== 2.1.0
|
26
|
-
|
27
|
-
* Adding support for Rails 4.2 (@hasghari, github issue #12)
|
28
|
-
|
29
|
-
== 2.1.1
|
30
|
-
|
31
|
-
* Fixing issue causing ArelTable instances to get returned when accessing records inside an ActiveRecord::Relation. (@svoynow, #18)
|
32
|
-
|
33
|
-
== 2.2.0
|
34
|
-
|
35
|
-
* Adding polymorphic join support for Rails 4.2.
|
36
|
-
|
37
|
-
== 2.3.0
|
38
|
-
|
39
|
-
* Adding support for Rails 5 (@vkill #24, @camertron #26)
|
40
|
-
|
41
|
-
== 2.4.0
|
42
|
-
|
43
|
-
* Adding support for Rails 5.1 (@hasghari #30)
|
44
|
-
|
45
|
-
== 2.5.0
|
46
|
-
|
47
|
-
* Add license information to gemspec so it is parsed by verifiers (@petergoldstein #31)
|
48
|
-
* Update QueryBuilder#reflect to create deep copy of builder (@wycleffsean #32)
|
49
|
-
|