active_record_union 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dc119e16853585b8595e9c7cf0de7b1282f30411
4
- data.tar.gz: eea98a19c016f681636e982ffffb9180e3876e4c
3
+ metadata.gz: 3b6908e8b32e304532e3b8405712ade67fab7e52
4
+ data.tar.gz: 937298c6d470715b18510f2e317a7f3d735b2cf6
5
5
  SHA512:
6
- metadata.gz: efa7fa3f32874d1052bf39f54b4e80e9135980bee70604bf18d12759ba42a5a8ca653427d78ea4ebb9ac6081654a91488ee6758c443d80f7e454061576b7d9f5
7
- data.tar.gz: db0f08034881ebe394d656b3b6f997719aaff48dcc979602ca68d8202454182583d50761e725de811bc35e23b5fcf66286947d868bcf1d14dbb103b22ca0ea65
6
+ metadata.gz: 8466c15bb3c268bbea28f49b3a85915e91f72bd43997462a4bd09a1da14ec9c85d5ca9621a6b7316ac04fe6949ccf4284bce854ed5b33c71bc492ca9bbd0cc9f
7
+ data.tar.gz: a99a9d9c0c19e332d9b0c357310d886c72c5b7f629be97a0d8e2dcdc8d90dcb1605960f3a44a8dacdfe0749dc7dfe6f2571ebe27d63a6bcb1970e7798447a88f
@@ -2,18 +2,10 @@ language: ruby
2
2
  addons:
3
3
  postgresql: "9.4"
4
4
  rvm:
5
- - 2.3.1
6
- - 2.2.5
7
- - 2.1.8
8
- - 2.0.0
5
+ - 2.3.6
9
6
  gemfile:
10
7
  - rails_4_2.gemfile
11
8
  - rails_5_0.gemfile
12
- matrix:
13
- exclude:
14
- # Rails 5 requires Ruby 2.2+:
15
- - rvm: 2.1.8
16
- gemfile: rails_5_0.gemfile
17
- - rvm: 2.0.0
18
- gemfile: rails_5_0.gemfile
9
+ - rails_5_1.gemfile
10
+ - rails_5_2.gemfile
19
11
  script: bundle exec rspec
data/README.md CHANGED
@@ -17,6 +17,8 @@ user_1.posts.union(user_2.posts).union(Post.published)
17
17
  user_1.posts.union_all(user_2.posts)
18
18
  ```
19
19
 
20
+ ActiveRecordUnion is tested against Rails 4.2 and Rails 5.0. It may or may not work on Rails 4.0/4.1.
21
+
20
22
  ## Installation
21
23
 
22
24
  Add this line to your application's Gemfile:
@@ -127,7 +129,7 @@ SELECT "posts".* FROM (
127
129
 
128
130
  There's a couple things to be aware of when using ActiveRecordUnion:
129
131
 
130
- 1. ActiveRecordUnion with raise an error if you try to UNION any relations that do any preloading/eager-loading. There's no sensible way to do the preloading in the subselects. If enough people complain maybe we can change ActiveRecordUnion to let the queries run anyway but without preloading any records.
132
+ 1. ActiveRecordUnion will raise an error if you try to UNION any relations that do any preloading/eager-loading. There's no sensible way to do the preloading in the subselects. If enough people complain, maybe, we can change ActiveRecordUnion to let the queries run anyway but without preloading any records.
131
133
  2. There's no easy way to get SQLite to allow ORDER BY in the UNION subselects. If you get a syntax error, you can either write `my_relation.reorder(nil).union(other.reorder(nil))` or switch to Postgres.
132
134
 
133
135
  ## Another nifty way to reduce extra queries
@@ -184,6 +186,9 @@ This is a gem not a Rails pull request because the standard of code quality for
184
186
 
185
187
  ## Changelog
186
188
 
189
+ **1.3.0** - January 14, 2018
190
+ - Ready for Rails 5.2! Updates provided by [@glebm](https://github.com/glebm).
191
+
187
192
  **1.2.0** - June 26, 2016
188
193
  - Ready for Rails 5.0! Updates provided by [@glebm](https://github.com/glebm).
189
194
 
@@ -209,9 +214,9 @@ This public domain dedication follows the the CC0 1.0 at https://creativecommons
209
214
  2. Create your feature branch (`git checkout -b my-new-feature`)
210
215
  3. Run the tests:
211
216
  1. Install MySQL and PostgreSQL.
212
- 2. You may need to create a `test_active_record_union` database on each under the default user.
213
- 3. Run `rake` to test with all supported Rails versions.
214
- 4. Run `rake test_rails_4_2` or `rake test_rails_5_0` to test a specific Rails version.
217
+ 2. You need to be able to connect to a local MySQL and Postgres database as the default user, so the specs can create a `test_active_record_union` database. From a vanilla install of MariaDB from Homebrew, this just works. For Postgres installed by Homebrew, you may need to run `$ echo "create database my_computer_user_name;" | psql postgres` since the initial database created by Homebrew is named "postgres" but PG defaults to connecting to a database named after your username.
218
+ 3. Run `rake` to test with all supported Rails versions. All needed dependencies will be installed via Bundler (`gem install bundler` if you happen not to have Bundler yet).
219
+ 4. Run `rake test_rails_4_2` or `rake test_rails_5_2` etc. to test a specific Rails version.
215
220
  4. There is also a `bin/console` command to load up a REPL for playing around
216
221
  5. Commit your changes (`git commit -am 'Add some feature'`)
217
222
  6. Push to the branch (`git push origin my-new-feature`)
@@ -18,7 +18,7 @@ module ActiveRecord
18
18
  private
19
19
 
20
20
  def set_operation(operation, relation_or_where_arg, *args)
21
- other = if args.size == 0 && Relation === relation_or_where_arg
21
+ other = if args.empty? && relation_or_where_arg.is_a?(Relation)
22
22
  relation_or_where_arg
23
23
  else
24
24
  @klass.where(relation_or_where_arg, *args)
@@ -26,24 +26,56 @@ module ActiveRecord
26
26
 
27
27
  verify_relations_for_set_operation!(operation, self, other)
28
28
 
29
+ left = self.arel.ast
30
+ right = other.arel.ast
31
+
29
32
  # Postgres allows ORDER BY in the UNION subqueries if each subquery is surrounded by parenthesis
30
- # but SQLite does not allow parens around the subqueries; you will have to explicitly do `relation.reorder(nil)` in SQLite
31
- if Arel::Visitors::SQLite === self.connection.visitor
32
- left, right = self.ast, other.ast
33
- else
34
- left, right = Arel::Nodes::Grouping.new(self.ast), Arel::Nodes::Grouping.new(other.ast)
33
+ # but SQLite does not allow parens around the subqueries
34
+ unless self.connection.visitor.is_a?(Arel::Visitors::SQLite)
35
+ left = Arel::Nodes::Grouping.new(left)
36
+ right = Arel::Nodes::Grouping.new(right)
35
37
  end
36
38
 
37
39
  set = SET_OPERATION_TO_AREL_CLASS[operation].new(left, right)
38
40
  from = Arel::Nodes::TableAlias.new(set, @klass.arel_table.name)
39
- if ActiveRecord::VERSION::MAJOR >= 5
40
- relation = @klass.unscoped.spawn
41
- relation.from_clause = UnionFromClause.new(from, nil, self.bound_attributes + other.bound_attributes)
42
- else
43
- relation = @klass.unscoped.from(from)
44
- relation.bind_values = self.arel.bind_values + self.bind_values + other.arel.bind_values + other.bind_values
41
+ build_union_relation(from, other)
42
+ end
43
+
44
+ if ActiveRecord.gem_version >= Gem::Version.new('5.2.0.beta2')
45
+ # Since Rails 5.2, binds are maintained only in the Arel AST.
46
+ def build_union_relation(arel_table_alias, _other)
47
+ @klass.unscoped.from(arel_table_alias)
48
+ end
49
+ elsif ActiveRecord::VERSION::MAJOR >= 5
50
+ # In Rails >= 5.0, < 5.2, binds are maintained only in ActiveRecord
51
+ # relations and clauses.
52
+ def build_union_relation(arel_table_alias, other)
53
+ relation = @klass.unscoped.spawn
54
+ relation.from_clause =
55
+ UnionFromClause.new(arel_table_alias, nil,
56
+ self.bound_attributes + other.bound_attributes)
57
+ relation
58
+ end
59
+
60
+ class UnionFromClause < ActiveRecord::Relation::FromClause
61
+ def initialize(value, name, bound_attributes)
62
+ super(value, name)
63
+ @bound_attributes = bound_attributes
64
+ end
65
+
66
+ def binds
67
+ @bound_attributes
68
+ end
69
+ end
70
+ else
71
+ # In Rails 4.x, binds are maintained in both ActiveRecord relations and
72
+ # clauses and also in their Arel ASTs.
73
+ def build_union_relation(arel_table_alias, other)
74
+ relation = @klass.unscoped.from(arel_table_alias)
75
+ relation.bind_values = self.arel.bind_values + self.bind_values +
76
+ other.arel.bind_values + other.bind_values
77
+ relation
45
78
  end
46
- relation
47
79
  end
48
80
 
49
81
  def verify_relations_for_set_operation!(operation, *relations)
@@ -63,19 +95,6 @@ module ActiveRecord
63
95
  raise ArgumentError.new("Cannot #{operation} relation with eager load.")
64
96
  end
65
97
  end
66
-
67
- if ActiveRecord::VERSION::MAJOR >= 5
68
- class UnionFromClause < ActiveRecord::Relation::FromClause
69
- def initialize(value, name, bound_attributes)
70
- super(value, name)
71
- @bound_attributes = bound_attributes
72
- end
73
-
74
- def binds
75
- @bound_attributes
76
- end
77
- end
78
- end
79
98
  end
80
99
  end
81
100
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveRecordUnion
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -3,4 +3,9 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in active_record_union.gemspec
4
4
  gemspec
5
5
 
6
- gem 'rails', '~> 4.2.6'
6
+ gem 'rails', '~> 4.2.7'
7
+
8
+ # On Rails < 5.2, only pg < v1 is supported. See:
9
+ # https://github.com/rails/rails/pull/31671
10
+ # https://bitbucket.org/ged/ruby-pg/issues/270/pg-100-x64-mingw32-rails-server-not-start
11
+ gem 'pg', '~> 0.21'
@@ -3,4 +3,9 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in active_record_union.gemspec
4
4
  gemspec
5
5
 
6
- gem 'rails', ['>= 5.0.0.rc2', '< 5.1']
6
+ gem 'rails', '~> 5.0.0'
7
+
8
+ # On Rails < 5.2, only pg < v1 is supported. See:
9
+ # https://github.com/rails/rails/pull/31671
10
+ # https://bitbucket.org/ged/ruby-pg/issues/270/pg-100-x64-mingw32-rails-server-not-start
11
+ gem 'pg', '~> 0.21'
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in active_record_union.gemspec
4
+ gemspec
5
+
6
+ gem 'rails', '~> 5.1.0'
7
+
8
+ # On Rails < 5.2, only pg < v1 is supported. See:
9
+ # https://github.com/rails/rails/pull/31671
10
+ # https://bitbucket.org/ged/ruby-pg/issues/270/pg-100-x64-mingw32-rails-server-not-start
11
+ gem 'pg', '~> 0.21'
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in active_record_union.gemspec
4
+ gemspec
5
+
6
+ # pg v1.0+ compatibility, https://github.com/rails/rails/pull/31671:
7
+ gem 'rails', '~> 5.2.0.beta2', git: 'https://github.com/rails/rails', ref: 'f1af27fd9d9101684b26d0dcf2028859d67bec1f'
@@ -41,7 +41,11 @@ describe ActiveRecord::Relation do
41
41
  end
42
42
 
43
43
  def bind_values_from_relation(relation)
44
- if ActiveRecord::VERSION::MAJOR >= 5
44
+ if ActiveRecord.gem_version >= Gem::Version.new('5.2.0.beta2')
45
+ relation.arel_table.class.engine.connection.visitor.accept(
46
+ relation.arel.ast, Arel::Collectors::Bind.new
47
+ ).value.map(&:value)
48
+ elsif ActiveRecord::VERSION::MAJOR >= 5
45
49
  relation.bound_attributes.map { |a| a.value_for_database }
46
50
  else
47
51
  (relation.arel.bind_values + relation.bind_values).map { |_column, value| value }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_union
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Hempel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-27 00:00:00.000000000 Z
11
+ date: 2018-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -141,6 +141,8 @@ files:
141
141
  - lib/active_record_union/version.rb
142
142
  - rails_4_2.gemfile
143
143
  - rails_5_0.gemfile
144
+ - rails_5_1.gemfile
145
+ - rails_5_2.gemfile
144
146
  - spec/spec_helper.rb
145
147
  - spec/support/databases.rb
146
148
  - spec/support/models.rb
@@ -165,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
167
  version: '0'
166
168
  requirements: []
167
169
  rubyforge_project:
168
- rubygems_version: 2.4.5.1
170
+ rubygems_version: 2.6.8
169
171
  signing_key:
170
172
  specification_version: 4
171
173
  summary: UNIONs in ActiveRecord! Adds proper union and union_all methods to ActiveRecord::Relation.