activerecord 5.0.0.beta4 → 5.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -2
- data/lib/active_record/associations/belongs_to_association.rb +1 -0
- data/lib/active_record/associations/builder/belongs_to.rb +2 -0
- data/lib/active_record/attributes.rb +6 -1
- data/lib/active_record/callbacks.rb +3 -3
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +29 -47
- data/lib/active_record/connection_adapters/abstract_adapter.rb +18 -0
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +6 -2
- data/lib/active_record/connection_adapters/connection_specification.rb +12 -5
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +5 -16
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +1 -1
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +0 -4
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -1
- data/lib/active_record/connection_handling.rb +22 -7
- data/lib/active_record/core.rb +1 -1
- data/lib/active_record/gem_version.rb +1 -1
- data/lib/active_record/locking/optimistic.rb +1 -1
- data/lib/active_record/migration.rb +3 -9
- data/lib/active_record/migration/compatibility.rb +10 -0
- data/lib/active_record/model_schema.rb +1 -1
- data/lib/active_record/querying.rb +1 -1
- data/lib/active_record/relation/batches/batch_enumerator.rb +1 -1
- data/lib/active_record/relation/delegation.rb +1 -1
- data/lib/active_record/relation/query_methods.rb +10 -4
- data/lib/active_record/tasks/database_tasks.rb +2 -2
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1e6174798f04c800a0e52f66e75d449c8d4decb
|
4
|
+
data.tar.gz: 54ea6f16f127647134074c201ac4dfc42500c96d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1957351dbfd43598306a1238fd38695d0f7d98247ea7e3ef7ffd34ad797c3623262f73c02076bf8b13f2992cf6dec5547c10f44621f74efeb6fbc9b6419f1a7
|
7
|
+
data.tar.gz: c9a45fadced0d55b6d3681222b08d8f8eb1ca844000d1f40f6f6dbd0c7480469a280ae3f7cc5b302e62c1615e3783a757adc5fed50236f00c7f88dd1cf6a1f26
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
## Rails 5.0.0.rc1 (May 06, 2016) ##
|
2
|
+
|
3
|
+
* No changes.
|
4
|
+
|
5
|
+
|
1
6
|
## Rails 5.0.0.beta4 (April 27, 2016) ##
|
2
7
|
|
3
8
|
* PostgreSQL: Support Expression Indexes and Operator Classes.
|
@@ -119,12 +124,11 @@
|
|
119
124
|
|
120
125
|
*Jeremy Daer*
|
121
126
|
|
122
|
-
* Delegate `
|
127
|
+
* Delegate `none?` and `one?`. Now they can be invoked as model class methods.
|
123
128
|
|
124
129
|
Example:
|
125
130
|
|
126
131
|
# When no record is found on the table
|
127
|
-
Topic.empty? # => true
|
128
132
|
Topic.none? # => true
|
129
133
|
|
130
134
|
# When only one record is found on the table
|
@@ -61,6 +61,7 @@ module ActiveRecord
|
|
61
61
|
|
62
62
|
def update_counters_on_replace(record)
|
63
63
|
if require_counter_update? && different_target?(record)
|
64
|
+
owner.instance_variable_set :@_after_replace_counter_called, true
|
64
65
|
record.increment!(reflection.counter_cache_column)
|
65
66
|
decrement_counters
|
66
67
|
end
|
@@ -33,6 +33,8 @@ module ActiveRecord::Associations::Builder # :nodoc:
|
|
33
33
|
|
34
34
|
if (@_after_create_counter_called ||= false)
|
35
35
|
@_after_create_counter_called = false
|
36
|
+
elsif (@_after_replace_counter_called ||= false)
|
37
|
+
@_after_replace_counter_called = false
|
36
38
|
elsif attribute_changed?(foreign_key) && !new_record?
|
37
39
|
if reflection.polymorphic?
|
38
40
|
model = attribute(reflection.foreign_type).try(:constantize)
|
@@ -67,12 +67,14 @@ module ActiveRecord
|
|
67
67
|
#
|
68
68
|
# A default can also be provided.
|
69
69
|
#
|
70
|
+
# # db/schema.rb
|
70
71
|
# create_table :store_listings, force: true do |t|
|
71
72
|
# t.string :my_string, default: "original default"
|
72
73
|
# end
|
73
74
|
#
|
74
75
|
# StoreListing.new.my_string # => "original default"
|
75
76
|
#
|
77
|
+
# # app/models/store_listing.rb
|
76
78
|
# class StoreListing < ActiveRecord::Base
|
77
79
|
# attribute :my_string, :string, default: "new default"
|
78
80
|
# end
|
@@ -89,6 +91,7 @@ module ActiveRecord
|
|
89
91
|
#
|
90
92
|
# \Attributes do not need to be backed by a database column.
|
91
93
|
#
|
94
|
+
# # app/models/my_model.rb
|
92
95
|
# class MyModel < ActiveRecord::Base
|
93
96
|
# attribute :my_string, :string
|
94
97
|
# attribute :my_int_array, :integer, array: true
|
@@ -131,7 +134,7 @@ module ActiveRecord
|
|
131
134
|
# # config/initializers/types.rb
|
132
135
|
# ActiveRecord::Type.register(:money, MoneyType)
|
133
136
|
#
|
134
|
-
# #
|
137
|
+
# # app/models/store_listing.rb
|
135
138
|
# class StoreListing < ActiveRecord::Base
|
136
139
|
# attribute :price_in_cents, :money
|
137
140
|
# end
|
@@ -167,8 +170,10 @@ module ActiveRecord
|
|
167
170
|
# end
|
168
171
|
# end
|
169
172
|
#
|
173
|
+
# # config/initializers/types.rb
|
170
174
|
# ActiveRecord::Type.register(:money, MoneyType)
|
171
175
|
#
|
176
|
+
# # app/models/product.rb
|
172
177
|
# class Product < ActiveRecord::Base
|
173
178
|
# currency_converter = ConversionRatesFromTheInternet.new
|
174
179
|
# attribute :price_in_bitcoins, :money, currency_converter: currency_converter
|
@@ -53,9 +53,9 @@ module ActiveRecord
|
|
53
53
|
# end
|
54
54
|
#
|
55
55
|
# class Firm < ActiveRecord::Base
|
56
|
-
# #
|
57
|
-
# before_destroy { |record| Person.
|
58
|
-
# before_destroy { |record| Client.
|
56
|
+
# # Disables access to the system, for associated clients and people when the firm is destroyed
|
57
|
+
# before_destroy { |record| Person.where(firm_id: record.id).update_all(access: 'disabled') }
|
58
|
+
# before_destroy { |record| Client.where(client_of: record.id).update_all(access: 'disabled') }
|
59
59
|
# end
|
60
60
|
#
|
61
61
|
# == Inheritable callback queues
|
@@ -778,8 +778,7 @@ module ActiveRecord
|
|
778
778
|
end
|
779
779
|
|
780
780
|
# ConnectionHandler is a collection of ConnectionPool objects. It is used
|
781
|
-
# for keeping separate connection pools
|
782
|
-
# to different databases.
|
781
|
+
# for keeping separate connection pools that connect to different databases.
|
783
782
|
#
|
784
783
|
# For example, suppose that you have 5 models, with the following hierarchy:
|
785
784
|
#
|
@@ -821,6 +820,10 @@ module ActiveRecord
|
|
821
820
|
# ConnectionHandler accessible via ActiveRecord::Base.connection_handler.
|
822
821
|
# All Active Record models use this handler to determine the connection pool that they
|
823
822
|
# should use.
|
823
|
+
#
|
824
|
+
# The ConnectionHandler class is not coupled with the Active models, as it has no knowlodge
|
825
|
+
# about the model. The model, needs to pass a specification name to the handler,
|
826
|
+
# in order to lookup the correct connection pool.
|
824
827
|
class ConnectionHandler
|
825
828
|
def initialize
|
826
829
|
# These caches are keyed by klass.name, NOT klass. Keying them by klass
|
@@ -829,9 +832,6 @@ module ActiveRecord
|
|
829
832
|
@owner_to_pool = Concurrent::Map.new(:initial_capacity => 2) do |h,k|
|
830
833
|
h[k] = Concurrent::Map.new(:initial_capacity => 2)
|
831
834
|
end
|
832
|
-
@class_to_pool = Concurrent::Map.new(:initial_capacity => 2) do |h,k|
|
833
|
-
h[k] = Concurrent::Map.new
|
834
|
-
end
|
835
835
|
end
|
836
836
|
|
837
837
|
def connection_pool_list
|
@@ -839,10 +839,8 @@ module ActiveRecord
|
|
839
839
|
end
|
840
840
|
alias :connection_pools :connection_pool_list
|
841
841
|
|
842
|
-
def establish_connection(
|
843
|
-
|
844
|
-
raise RuntimeError, "Anonymous class is not allowed." unless owner.name
|
845
|
-
owner_to_pool[owner.name] = ConnectionAdapters::ConnectionPool.new(spec)
|
842
|
+
def establish_connection(spec)
|
843
|
+
owner_to_pool[spec.name] = ConnectionAdapters::ConnectionPool.new(spec)
|
846
844
|
end
|
847
845
|
|
848
846
|
# Returns true if there are any active connections among the connection
|
@@ -873,18 +871,18 @@ module ActiveRecord
|
|
873
871
|
# active or defined connection: if it is the latter, it will be
|
874
872
|
# opened and set as the active connection for the class it was defined
|
875
873
|
# for (not necessarily the current class).
|
876
|
-
def retrieve_connection(
|
877
|
-
pool = retrieve_connection_pool(
|
878
|
-
raise ConnectionNotEstablished, "No connection pool
|
874
|
+
def retrieve_connection(spec_name) #:nodoc:
|
875
|
+
pool = retrieve_connection_pool(spec_name)
|
876
|
+
raise ConnectionNotEstablished, "No connection pool with id #{spec_name} found." unless pool
|
879
877
|
conn = pool.connection
|
880
|
-
raise ConnectionNotEstablished, "No connection for #{
|
878
|
+
raise ConnectionNotEstablished, "No connection for #{spec_name} in connection pool" unless conn
|
881
879
|
conn
|
882
880
|
end
|
883
881
|
|
884
882
|
# Returns true if a connection that's accessible to this class has
|
885
883
|
# already been opened.
|
886
|
-
def connected?(
|
887
|
-
conn = retrieve_connection_pool(
|
884
|
+
def connected?(spec_name)
|
885
|
+
conn = retrieve_connection_pool(spec_name)
|
888
886
|
conn && conn.connected?
|
889
887
|
end
|
890
888
|
|
@@ -892,9 +890,8 @@ module ActiveRecord
|
|
892
890
|
# connection and the defined connection (if they exist). The result
|
893
891
|
# can be used as an argument for establish_connection, for easily
|
894
892
|
# re-establishing the connection.
|
895
|
-
def remove_connection(
|
896
|
-
if pool = owner_to_pool.delete(
|
897
|
-
@class_to_pool.clear
|
893
|
+
def remove_connection(spec_name)
|
894
|
+
if pool = owner_to_pool.delete(spec_name)
|
898
895
|
pool.automatic_reconnect = false
|
899
896
|
pool.disconnect!
|
900
897
|
pool.spec.config
|
@@ -910,14 +907,18 @@ module ActiveRecord
|
|
910
907
|
# #fetch is significantly slower than #[]. So in the nil case, no caching will
|
911
908
|
# take place, but that's ok since the nil case is not the common one that we wish
|
912
909
|
# to optimise for.
|
913
|
-
def retrieve_connection_pool(
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
910
|
+
def retrieve_connection_pool(spec_name)
|
911
|
+
owner_to_pool.fetch(spec_name) do
|
912
|
+
if ancestor_pool = pool_from_any_process_for(spec_name)
|
913
|
+
# A connection was established in an ancestor process that must have
|
914
|
+
# subsequently forked. We can't reuse the connection, but we can copy
|
915
|
+
# the specification and establish a new connection with it.
|
916
|
+
establish_connection(ancestor_pool.spec).tap do |pool|
|
917
|
+
pool.schema_cache = ancestor_pool.schema_cache if ancestor_pool.schema_cache
|
918
|
+
end
|
919
|
+
else
|
920
|
+
owner_to_pool[spec_name] = nil
|
918
921
|
end
|
919
|
-
|
920
|
-
class_to_pool[klass.name] = pool
|
921
922
|
end
|
922
923
|
end
|
923
924
|
|
@@ -927,28 +928,9 @@ module ActiveRecord
|
|
927
928
|
@owner_to_pool[Process.pid]
|
928
929
|
end
|
929
930
|
|
930
|
-
def
|
931
|
-
@
|
932
|
-
|
933
|
-
|
934
|
-
def pool_for(owner)
|
935
|
-
owner_to_pool.fetch(owner.name) {
|
936
|
-
if ancestor_pool = pool_from_any_process_for(owner)
|
937
|
-
# A connection was established in an ancestor process that must have
|
938
|
-
# subsequently forked. We can't reuse the connection, but we can copy
|
939
|
-
# the specification and establish a new connection with it.
|
940
|
-
establish_connection(owner, ancestor_pool.spec).tap do |pool|
|
941
|
-
pool.schema_cache = ancestor_pool.schema_cache if ancestor_pool.schema_cache
|
942
|
-
end
|
943
|
-
else
|
944
|
-
owner_to_pool[owner.name] = nil
|
945
|
-
end
|
946
|
-
}
|
947
|
-
end
|
948
|
-
|
949
|
-
def pool_from_any_process_for(owner)
|
950
|
-
owner_to_pool = @owner_to_pool.values.find { |v| v[owner.name] }
|
951
|
-
owner_to_pool && owner_to_pool[owner.name]
|
931
|
+
def pool_from_any_process_for(spec_name)
|
932
|
+
owner_to_pool = @owner_to_pool.values.find { |v| v[spec_name] }
|
933
|
+
owner_to_pool && owner_to_pool[spec_name]
|
952
934
|
end
|
953
935
|
end
|
954
936
|
end
|
@@ -454,6 +454,24 @@ module ActiveRecord
|
|
454
454
|
visitor.accept(node, collector).value
|
455
455
|
end
|
456
456
|
|
457
|
+
def combine_bind_parameters(
|
458
|
+
from_clause: [],
|
459
|
+
join_clause: [],
|
460
|
+
where_clause: [],
|
461
|
+
having_clause: [],
|
462
|
+
limit: nil,
|
463
|
+
offset: nil
|
464
|
+
) # :nodoc:
|
465
|
+
result = from_clause + join_clause + where_clause + having_clause
|
466
|
+
if limit
|
467
|
+
result << limit
|
468
|
+
end
|
469
|
+
if offset
|
470
|
+
result << offset
|
471
|
+
end
|
472
|
+
result
|
473
|
+
end
|
474
|
+
|
457
475
|
protected
|
458
476
|
|
459
477
|
def initialize_type_map(m) # :nodoc:
|
@@ -20,7 +20,7 @@ module ActiveRecord
|
|
20
20
|
MySQL::Table.new(table_name, base)
|
21
21
|
end
|
22
22
|
|
23
|
-
def schema_creation
|
23
|
+
def schema_creation # :nodoc:
|
24
24
|
MySQL::SchemaCreation.new(self)
|
25
25
|
end
|
26
26
|
|
@@ -502,8 +502,12 @@ module ActiveRecord
|
|
502
502
|
def add_index(table_name, column_name, options = {}) #:nodoc:
|
503
503
|
index_name, index_type, index_columns, _, index_algorithm, index_using, comment = add_index_options(table_name, column_name, options)
|
504
504
|
sql = "CREATE #{index_type} INDEX #{quote_column_name(index_name)} #{index_using} ON #{quote_table_name(table_name)} (#{index_columns}) #{index_algorithm}"
|
505
|
+
execute add_sql_comment!(sql, comment)
|
506
|
+
end
|
507
|
+
|
508
|
+
def add_sql_comment!(sql, comment) # :nodoc:
|
505
509
|
sql << " COMMENT #{quote(comment)}" if comment
|
506
|
-
|
510
|
+
sql
|
507
511
|
end
|
508
512
|
|
509
513
|
def foreign_keys(table_name)
|
@@ -3,10 +3,10 @@ require 'uri'
|
|
3
3
|
module ActiveRecord
|
4
4
|
module ConnectionAdapters
|
5
5
|
class ConnectionSpecification #:nodoc:
|
6
|
-
attr_reader :config, :adapter_method
|
6
|
+
attr_reader :name, :config, :adapter_method
|
7
7
|
|
8
|
-
def initialize(config, adapter_method)
|
9
|
-
@config, @adapter_method = config, adapter_method
|
8
|
+
def initialize(name, config, adapter_method)
|
9
|
+
@name, @config, @adapter_method = name, config, adapter_method
|
10
10
|
end
|
11
11
|
|
12
12
|
def initialize_dup(original)
|
@@ -164,7 +164,7 @@ module ActiveRecord
|
|
164
164
|
# spec.config
|
165
165
|
# # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }
|
166
166
|
#
|
167
|
-
def spec(config)
|
167
|
+
def spec(config, name = nil)
|
168
168
|
spec = resolve(config).symbolize_keys
|
169
169
|
|
170
170
|
raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
|
@@ -179,7 +179,14 @@ module ActiveRecord
|
|
179
179
|
end
|
180
180
|
|
181
181
|
adapter_method = "#{spec[:adapter]}_connection"
|
182
|
-
|
182
|
+
|
183
|
+
name ||=
|
184
|
+
if config.is_a?(Symbol)
|
185
|
+
config.to_s
|
186
|
+
else
|
187
|
+
"primary"
|
188
|
+
end
|
189
|
+
ConnectionSpecification.new(name, spec, adapter_method)
|
183
190
|
end
|
184
191
|
|
185
192
|
private
|
@@ -2,8 +2,8 @@ module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
3
3
|
module MySQL
|
4
4
|
class SchemaCreation < AbstractAdapter::SchemaCreation
|
5
|
-
delegate :
|
6
|
-
private :
|
5
|
+
delegate :add_sql_comment!, to: :@conn
|
6
|
+
private :add_sql_comment!
|
7
7
|
|
8
8
|
private
|
9
9
|
|
@@ -26,11 +26,7 @@ module ActiveRecord
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def add_table_options!(create_sql, options)
|
29
|
-
super
|
30
|
-
|
31
|
-
if comment = options[:comment]
|
32
|
-
create_sql << " COMMENT #{quote(comment)}"
|
33
|
-
end
|
29
|
+
add_sql_comment!(super, options[:comment])
|
34
30
|
end
|
35
31
|
|
36
32
|
def column_options(o)
|
@@ -48,13 +44,7 @@ module ActiveRecord
|
|
48
44
|
sql << " COLLATE #{collation}"
|
49
45
|
end
|
50
46
|
|
51
|
-
super
|
52
|
-
|
53
|
-
if comment = options[:comment]
|
54
|
-
sql << " COMMENT #{quote(comment)}"
|
55
|
-
end
|
56
|
-
|
57
|
-
sql
|
47
|
+
add_sql_comment!(super, options[:comment])
|
58
48
|
end
|
59
49
|
|
60
50
|
def add_column_position!(sql, options)
|
@@ -69,8 +59,7 @@ module ActiveRecord
|
|
69
59
|
|
70
60
|
def index_in_create(table_name, column_name, options)
|
71
61
|
index_name, index_type, index_columns, _, _, index_using, comment = @conn.add_index_options(table_name, column_name, options)
|
72
|
-
|
73
|
-
"#{index_type} INDEX #{quote_column_name(index_name)} #{index_using} (#{index_columns})#{index_option} "
|
62
|
+
add_sql_comment!("#{index_type} INDEX #{quote_column_name(index_name)} #{index_using} (#{index_columns})", comment)
|
74
63
|
end
|
75
64
|
end
|
76
65
|
end
|
@@ -217,7 +217,7 @@ module ActiveRecord
|
|
217
217
|
]
|
218
218
|
end
|
219
219
|
|
220
|
-
IndexDefinition.new(table_name, index_name, unique, columns, [], orders, where, nil, using.to_sym, comment)
|
220
|
+
IndexDefinition.new(table_name, index_name, unique, columns, [], orders, where, nil, using.to_sym, comment.presence)
|
221
221
|
end.compact
|
222
222
|
end
|
223
223
|
|
@@ -541,7 +541,7 @@ module ActiveRecord
|
|
541
541
|
result = exec_query(sql, 'SCHEMA').first
|
542
542
|
|
543
543
|
if result
|
544
|
-
# Splitting with left
|
544
|
+
# Splitting with left parentheses and picking up last will return all
|
545
545
|
# columns separated with comma(,).
|
546
546
|
columns_string = result["sql"].split('(').last
|
547
547
|
|
@@ -45,16 +45,20 @@ module ActiveRecord
|
|
45
45
|
# The exceptions AdapterNotSpecified, AdapterNotFound and +ArgumentError+
|
46
46
|
# may be returned on an error.
|
47
47
|
def establish_connection(spec = nil)
|
48
|
+
raise RuntimeError, "Anonymous class is not allowed." unless name
|
49
|
+
|
48
50
|
spec ||= DEFAULT_ENV.call.to_sym
|
49
51
|
resolver = ConnectionAdapters::ConnectionSpecification::Resolver.new configurations
|
50
|
-
|
52
|
+
# TODO: uses name on establish_connection, for backwards compatibility
|
53
|
+
spec = resolver.spec(spec, self == Base ? "primary" : name)
|
54
|
+
self.connection_specification_name = spec.name
|
51
55
|
|
52
56
|
unless respond_to?(spec.adapter_method)
|
53
57
|
raise AdapterNotFound, "database configuration specifies nonexistent #{spec.config[:adapter]} adapter"
|
54
58
|
end
|
55
59
|
|
56
60
|
remove_connection
|
57
|
-
connection_handler.establish_connection
|
61
|
+
connection_handler.establish_connection spec
|
58
62
|
end
|
59
63
|
|
60
64
|
class MergeAndResolveDefaultUrlConfig # :nodoc:
|
@@ -87,6 +91,17 @@ module ActiveRecord
|
|
87
91
|
retrieve_connection
|
88
92
|
end
|
89
93
|
|
94
|
+
attr_writer :connection_specification_name
|
95
|
+
|
96
|
+
# Return the specification id from this class otherwise look it up
|
97
|
+
# in the parent.
|
98
|
+
def connection_specification_name
|
99
|
+
unless defined?(@connection_specification_name)
|
100
|
+
@connection_specification_name = self == Base ? "primary" : superclass.connection_specification_name
|
101
|
+
end
|
102
|
+
@connection_specification_name
|
103
|
+
end
|
104
|
+
|
90
105
|
def connection_id
|
91
106
|
ActiveRecord::RuntimeRegistry.connection_id ||= Thread.current.object_id
|
92
107
|
end
|
@@ -106,20 +121,20 @@ module ActiveRecord
|
|
106
121
|
end
|
107
122
|
|
108
123
|
def connection_pool
|
109
|
-
connection_handler.retrieve_connection_pool(
|
124
|
+
connection_handler.retrieve_connection_pool(connection_specification_name) or raise ConnectionNotEstablished
|
110
125
|
end
|
111
126
|
|
112
127
|
def retrieve_connection
|
113
|
-
connection_handler.retrieve_connection(
|
128
|
+
connection_handler.retrieve_connection(connection_specification_name)
|
114
129
|
end
|
115
130
|
|
116
131
|
# Returns +true+ if Active Record is connected.
|
117
132
|
def connected?
|
118
|
-
connection_handler.connected?(
|
133
|
+
connection_handler.connected?(connection_specification_name)
|
119
134
|
end
|
120
135
|
|
121
|
-
def remove_connection(
|
122
|
-
connection_handler.remove_connection(
|
136
|
+
def remove_connection(name = connection_specification_name)
|
137
|
+
connection_handler.remove_connection(name)
|
123
138
|
end
|
124
139
|
|
125
140
|
def clear_cache! # :nodoc:
|
data/lib/active_record/core.rb
CHANGED
@@ -257,7 +257,7 @@ module ActiveRecord
|
|
257
257
|
# Returns the Arel engine.
|
258
258
|
def arel_engine # :nodoc:
|
259
259
|
@arel_engine ||=
|
260
|
-
if Base == self || connection_handler.retrieve_connection_pool(
|
260
|
+
if Base == self || connection_handler.retrieve_connection_pool(connection_specification_name)
|
261
261
|
self
|
262
262
|
else
|
263
263
|
superclass.arel_engine
|
@@ -150,7 +150,7 @@ module ActiveRecord
|
|
150
150
|
|
151
151
|
# The version column used for optimistic locking. Defaults to +lock_version+.
|
152
152
|
def locking_column
|
153
|
-
|
153
|
+
@locking_column = DEFAULT_LOCKING_COLUMN unless defined?(@locking_column)
|
154
154
|
@locking_column
|
155
155
|
end
|
156
156
|
|
@@ -277,7 +277,7 @@ module ActiveRecord
|
|
277
277
|
# * <tt>change_column(table_name, column_name, type, options)</tt>: Changes
|
278
278
|
# the column to a different type using the same parameters as add_column.
|
279
279
|
# * <tt>change_column_default(table_name, column_name, default)</tt>: Sets a
|
280
|
-
# default value for +column_name+
|
280
|
+
# default value for +column_name+ defined by +default+ on +table_name+.
|
281
281
|
# * <tt>change_column_null(table_name, column_name, null, default = nil)</tt>:
|
282
282
|
# Sets or removes a +NOT NULL+ constraint on +column_name+. The +null+ flag
|
283
283
|
# indicates whether the value can be +NULL+. See
|
@@ -524,17 +524,11 @@ module ActiveRecord
|
|
524
524
|
end
|
525
525
|
|
526
526
|
def self.[](version)
|
527
|
-
version
|
528
|
-
name = "V#{version.tr('.', '_')}"
|
529
|
-
unless Compatibility.const_defined?(name)
|
530
|
-
versions = Compatibility.constants.grep(/\AV[0-9_]+\z/).map { |s| s.to_s.delete('V').tr('_', '.').inspect }
|
531
|
-
raise ArgumentError, "Unknown migration version #{version.inspect}; expected one of #{versions.sort.join(', ')}"
|
532
|
-
end
|
533
|
-
Compatibility.const_get(name)
|
527
|
+
Compatibility.find(version)
|
534
528
|
end
|
535
529
|
|
536
530
|
def self.current_version
|
537
|
-
|
531
|
+
ActiveRecord::VERSION::STRING.to_f
|
538
532
|
end
|
539
533
|
|
540
534
|
MigrationFilenameRegexp = /\A([0-9]+)_([_a-z0-9]*)\.?([_a-z0-9]*)?\.rb\z/ # :nodoc:
|
@@ -1,6 +1,16 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
class Migration
|
3
3
|
module Compatibility # :nodoc: all
|
4
|
+
def self.find(version)
|
5
|
+
version = version.to_s
|
6
|
+
name = "V#{version.tr('.', '_')}"
|
7
|
+
unless const_defined?(name)
|
8
|
+
versions = constants.grep(/\AV[0-9_]+\z/).map { |s| s.to_s.delete('V').tr('_', '.').inspect }
|
9
|
+
raise ArgumentError, "Unknown migration version #{version.inspect}; expected one of #{versions.sort.join(', ')}"
|
10
|
+
end
|
11
|
+
const_get(name)
|
12
|
+
end
|
13
|
+
|
4
14
|
V5_0 = Current
|
5
15
|
|
6
16
|
module FourTwoShared
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
module Querying
|
3
|
-
delegate :find, :take, :take!, :first, :first!, :last, :last!, :exists?, :any?, :many?, :
|
3
|
+
delegate :find, :take, :take!, :first, :first!, :last, :last!, :exists?, :any?, :many?, :none?, :one?, to: :all
|
4
4
|
delegate :second, :second!, :third, :third!, :fourth, :fourth!, :fifth, :fifth!, :forty_two, :forty_two!, :third_to_last, :third_to_last!, :second_to_last, :second_to_last!, to: :all
|
5
5
|
delegate :first_or_create, :first_or_create!, :first_or_initialize, to: :all
|
6
6
|
delegate :find_or_create_by, :find_or_create_by!, :find_or_initialize_by, to: :all
|
@@ -42,7 +42,7 @@ module ActiveRecord
|
|
42
42
|
# Delegates #delete_all, #update_all, #destroy_all methods to each batch.
|
43
43
|
#
|
44
44
|
# People.in_batches.delete_all
|
45
|
-
# People.
|
45
|
+
# People.where('age < 10').in_batches.destroy_all
|
46
46
|
# People.in_batches.update_all('age = age + 1')
|
47
47
|
[:delete_all, :update_all, :destroy_all].each do |method|
|
48
48
|
define_method(method) do |*args, &block|
|
@@ -35,7 +35,7 @@ module ActiveRecord
|
|
35
35
|
# may vary depending on the klass of a relation, so we create a subclass of Relation
|
36
36
|
# for each different klass, and the delegations are compiled into that subclass only.
|
37
37
|
|
38
|
-
delegate :to_xml, :
|
38
|
+
delegate :to_xml, :encode_with, :length, :collect, :map, :each, :all?, :include?, :to_ary, :join,
|
39
39
|
:[], :&, :|, :+, :-, :sample, :reverse, :compact, :in_groups, :in_groups_of,
|
40
40
|
:shuffle, :split, to: :records
|
41
41
|
|
@@ -99,22 +99,28 @@ module ActiveRecord
|
|
99
99
|
end
|
100
100
|
|
101
101
|
def bound_attributes
|
102
|
-
result = from_clause.binds + arel.bind_values + where_clause.binds + having_clause.binds
|
103
102
|
if limit_value && !string_containing_comma?(limit_value)
|
104
|
-
|
103
|
+
limit_bind = Attribute.with_cast_value(
|
105
104
|
"LIMIT".freeze,
|
106
105
|
connection.sanitize_limit(limit_value),
|
107
106
|
Type::Value.new,
|
108
107
|
)
|
109
108
|
end
|
110
109
|
if offset_value
|
111
|
-
|
110
|
+
offset_bind = Attribute.with_cast_value(
|
112
111
|
"OFFSET".freeze,
|
113
112
|
offset_value.to_i,
|
114
113
|
Type::Value.new,
|
115
114
|
)
|
116
115
|
end
|
117
|
-
|
116
|
+
connection.combine_bind_parameters(
|
117
|
+
from_clause: from_clause.binds,
|
118
|
+
join_clause: arel.bind_values,
|
119
|
+
where_clause: where_clause.binds,
|
120
|
+
having_clause: having_clause.binds,
|
121
|
+
limit: limit_bind,
|
122
|
+
offset: offset_bind,
|
123
|
+
)
|
118
124
|
end
|
119
125
|
|
120
126
|
FROZEN_EMPTY_HASH = {}.freeze
|
@@ -117,10 +117,10 @@ module ActiveRecord
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def create_all
|
120
|
-
old_pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool(ActiveRecord::Base)
|
120
|
+
old_pool = ActiveRecord::Base.connection_handler.retrieve_connection_pool(ActiveRecord::Base.connection_specification_name)
|
121
121
|
each_local_configuration { |configuration| create configuration }
|
122
122
|
if old_pool
|
123
|
-
ActiveRecord::Base.connection_handler.establish_connection(
|
123
|
+
ActiveRecord::Base.connection_handler.establish_connection(old_pool.spec)
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.0.
|
4
|
+
version: 5.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 5.0.0.
|
19
|
+
version: 5.0.0.rc1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 5.0.0.
|
26
|
+
version: 5.0.0.rc1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activemodel
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 5.0.0.
|
33
|
+
version: 5.0.0.rc1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 5.0.0.
|
40
|
+
version: 5.0.0.rc1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: arel
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -328,7 +328,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
328
328
|
version: 1.3.1
|
329
329
|
requirements: []
|
330
330
|
rubyforge_project:
|
331
|
-
rubygems_version: 2.
|
331
|
+
rubygems_version: 2.5.1
|
332
332
|
signing_key:
|
333
333
|
specification_version: 4
|
334
334
|
summary: Object-relational mapper framework (part of Rails).
|