activerecord 3.2.22.4 → 4.0.13
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 +2799 -617
- data/MIT-LICENSE +1 -1
- data/README.rdoc +23 -32
- data/examples/performance.rb +1 -1
- data/lib/active_record/aggregations.rb +40 -34
- data/lib/active_record/association_relation.rb +22 -0
- data/lib/active_record/associations/alias_tracker.rb +4 -2
- data/lib/active_record/associations/association.rb +60 -46
- data/lib/active_record/associations/association_scope.rb +46 -40
- data/lib/active_record/associations/belongs_to_association.rb +17 -4
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +1 -1
- data/lib/active_record/associations/builder/association.rb +81 -28
- data/lib/active_record/associations/builder/belongs_to.rb +73 -56
- data/lib/active_record/associations/builder/collection_association.rb +54 -40
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +23 -41
- data/lib/active_record/associations/builder/has_many.rb +8 -64
- data/lib/active_record/associations/builder/has_one.rb +13 -50
- data/lib/active_record/associations/builder/singular_association.rb +13 -13
- data/lib/active_record/associations/collection_association.rb +130 -96
- data/lib/active_record/associations/collection_proxy.rb +916 -63
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +15 -13
- data/lib/active_record/associations/has_many_association.rb +35 -8
- data/lib/active_record/associations/has_many_through_association.rb +37 -17
- data/lib/active_record/associations/has_one_association.rb +42 -19
- data/lib/active_record/associations/has_one_through_association.rb +1 -1
- data/lib/active_record/associations/join_dependency/join_association.rb +39 -22
- data/lib/active_record/associations/join_dependency/join_base.rb +2 -2
- data/lib/active_record/associations/join_dependency/join_part.rb +21 -8
- data/lib/active_record/associations/join_dependency.rb +30 -9
- data/lib/active_record/associations/join_helper.rb +1 -11
- data/lib/active_record/associations/preloader/association.rb +29 -33
- data/lib/active_record/associations/preloader/collection_association.rb +1 -1
- data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +2 -2
- data/lib/active_record/associations/preloader/has_many_through.rb +6 -2
- data/lib/active_record/associations/preloader/has_one.rb +1 -1
- data/lib/active_record/associations/preloader/through_association.rb +13 -17
- data/lib/active_record/associations/preloader.rb +20 -43
- data/lib/active_record/associations/singular_association.rb +11 -11
- data/lib/active_record/associations/through_association.rb +3 -3
- data/lib/active_record/associations.rb +223 -282
- data/lib/active_record/attribute_assignment.rb +134 -154
- data/lib/active_record/attribute_methods/before_type_cast.rb +44 -5
- data/lib/active_record/attribute_methods/dirty.rb +36 -29
- data/lib/active_record/attribute_methods/primary_key.rb +45 -31
- data/lib/active_record/attribute_methods/query.rb +5 -4
- data/lib/active_record/attribute_methods/read.rb +67 -90
- data/lib/active_record/attribute_methods/serialization.rb +133 -70
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +51 -45
- data/lib/active_record/attribute_methods/write.rb +34 -39
- data/lib/active_record/attribute_methods.rb +268 -108
- data/lib/active_record/autosave_association.rb +80 -73
- data/lib/active_record/base.rb +54 -451
- data/lib/active_record/callbacks.rb +60 -22
- data/lib/active_record/coders/yaml_column.rb +18 -21
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +347 -197
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +9 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +146 -138
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +25 -19
- data/lib/active_record/connection_adapters/abstract/quoting.rb +19 -3
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +151 -142
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +70 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +499 -217
- data/lib/active_record/connection_adapters/abstract/transaction.rb +208 -0
- data/lib/active_record/connection_adapters/abstract_adapter.rb +209 -44
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +169 -61
- data/lib/active_record/connection_adapters/column.rb +67 -36
- data/lib/active_record/connection_adapters/connection_specification.rb +96 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +28 -29
- data/lib/active_record/connection_adapters/mysql_adapter.rb +200 -73
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +98 -0
- data/lib/active_record/connection_adapters/postgresql/cast.rb +160 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +240 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +374 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +183 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +508 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +544 -899
- data/lib/active_record/connection_adapters/schema_cache.rb +76 -16
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +595 -16
- data/lib/active_record/connection_handling.rb +98 -0
- data/lib/active_record/core.rb +472 -0
- data/lib/active_record/counter_cache.rb +107 -108
- data/lib/active_record/dynamic_matchers.rb +115 -63
- data/lib/active_record/errors.rb +36 -18
- data/lib/active_record/explain.rb +15 -63
- data/lib/active_record/explain_registry.rb +30 -0
- data/lib/active_record/explain_subscriber.rb +8 -4
- data/lib/active_record/fixture_set/file.rb +55 -0
- data/lib/active_record/fixtures.rb +159 -155
- data/lib/active_record/inheritance.rb +93 -59
- data/lib/active_record/integration.rb +8 -8
- data/lib/active_record/locale/en.yml +8 -1
- data/lib/active_record/locking/optimistic.rb +39 -43
- data/lib/active_record/locking/pessimistic.rb +4 -4
- data/lib/active_record/log_subscriber.rb +19 -9
- data/lib/active_record/migration/command_recorder.rb +102 -33
- data/lib/active_record/migration/join_table.rb +15 -0
- data/lib/active_record/migration.rb +411 -173
- data/lib/active_record/model_schema.rb +81 -94
- data/lib/active_record/nested_attributes.rb +173 -131
- data/lib/active_record/null_relation.rb +67 -0
- data/lib/active_record/persistence.rb +254 -106
- data/lib/active_record/query_cache.rb +18 -36
- data/lib/active_record/querying.rb +19 -15
- data/lib/active_record/railtie.rb +113 -38
- data/lib/active_record/railties/console_sandbox.rb +3 -4
- data/lib/active_record/railties/controller_runtime.rb +4 -3
- data/lib/active_record/railties/databases.rake +115 -368
- data/lib/active_record/railties/jdbcmysql_error.rb +1 -1
- data/lib/active_record/readonly_attributes.rb +7 -3
- data/lib/active_record/reflection.rb +110 -61
- data/lib/active_record/relation/batches.rb +29 -29
- data/lib/active_record/relation/calculations.rb +155 -125
- data/lib/active_record/relation/delegation.rb +94 -18
- data/lib/active_record/relation/finder_methods.rb +151 -203
- data/lib/active_record/relation/merger.rb +188 -0
- data/lib/active_record/relation/predicate_builder.rb +85 -42
- data/lib/active_record/relation/query_methods.rb +793 -146
- data/lib/active_record/relation/spawn_methods.rb +43 -150
- data/lib/active_record/relation.rb +293 -173
- data/lib/active_record/result.rb +48 -7
- data/lib/active_record/runtime_registry.rb +17 -0
- data/lib/active_record/sanitization.rb +41 -54
- data/lib/active_record/schema.rb +19 -12
- data/lib/active_record/schema_dumper.rb +41 -41
- data/lib/active_record/schema_migration.rb +46 -0
- data/lib/active_record/scoping/default.rb +56 -52
- data/lib/active_record/scoping/named.rb +78 -103
- data/lib/active_record/scoping.rb +54 -124
- data/lib/active_record/serialization.rb +6 -2
- data/lib/active_record/serializers/xml_serializer.rb +9 -15
- data/lib/active_record/statement_cache.rb +26 -0
- data/lib/active_record/store.rb +131 -15
- data/lib/active_record/tasks/database_tasks.rb +204 -0
- data/lib/active_record/tasks/firebird_database_tasks.rb +56 -0
- data/lib/active_record/tasks/mysql_database_tasks.rb +144 -0
- data/lib/active_record/tasks/oracle_database_tasks.rb +45 -0
- data/lib/active_record/tasks/postgresql_database_tasks.rb +90 -0
- data/lib/active_record/tasks/sqlite_database_tasks.rb +51 -0
- data/lib/active_record/tasks/sqlserver_database_tasks.rb +48 -0
- data/lib/active_record/test_case.rb +67 -38
- data/lib/active_record/timestamp.rb +16 -11
- data/lib/active_record/transactions.rb +73 -51
- data/lib/active_record/validations/associated.rb +19 -13
- data/lib/active_record/validations/presence.rb +65 -0
- data/lib/active_record/validations/uniqueness.rb +110 -57
- data/lib/active_record/validations.rb +18 -17
- data/lib/active_record/version.rb +7 -6
- data/lib/active_record.rb +63 -45
- data/lib/rails/generators/active_record/migration/migration_generator.rb +45 -8
- data/lib/rails/generators/active_record/{model/templates/migration.rb → migration/templates/create_table_migration.rb} +4 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb +20 -15
- data/lib/rails/generators/active_record/model/model_generator.rb +5 -4
- data/lib/rails/generators/active_record/model/templates/model.rb +4 -6
- data/lib/rails/generators/active_record/model/templates/module.rb +1 -1
- data/lib/rails/generators/active_record.rb +3 -5
- metadata +43 -29
- data/examples/associations.png +0 -0
- data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +0 -32
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -191
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -583
- data/lib/active_record/dynamic_finder_match.rb +0 -68
- data/lib/active_record/dynamic_scope_match.rb +0 -23
- data/lib/active_record/fixtures/file.rb +0 -65
- data/lib/active_record/identity_map.rb +0 -162
- data/lib/active_record/observer.rb +0 -121
- data/lib/active_record/session_store.rb +0 -360
- data/lib/rails/generators/active_record/migration.rb +0 -15
- data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
- data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -4
- data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -25
- data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -12
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'active_support/core_ext/array/wrap'
|
2
|
-
|
3
1
|
module ActiveRecord
|
4
2
|
# = Active Record Callbacks
|
5
3
|
#
|
@@ -25,19 +23,22 @@ module ActiveRecord
|
|
25
23
|
# Check out <tt>ActiveRecord::Transactions</tt> for more details about <tt>after_commit</tt> and
|
26
24
|
# <tt>after_rollback</tt>.
|
27
25
|
#
|
28
|
-
#
|
26
|
+
# Additionally, an <tt>after_touch</tt> callback is triggered whenever an
|
27
|
+
# object is touched.
|
28
|
+
#
|
29
|
+
# Lastly an <tt>after_find</tt> and <tt>after_initialize</tt> callback is triggered for each object that
|
29
30
|
# is found and instantiated by a finder, with <tt>after_initialize</tt> being triggered after new objects
|
30
31
|
# are instantiated as well.
|
31
32
|
#
|
32
|
-
#
|
33
|
+
# There are nineteen callbacks in total, which give you immense power to react and prepare for each state in the
|
33
34
|
# Active Record life cycle. The sequence for calling <tt>Base#save</tt> for an existing record is similar,
|
34
35
|
# except that each <tt>_create</tt> callback is replaced by the corresponding <tt>_update</tt> callback.
|
35
36
|
#
|
36
37
|
# Examples:
|
37
38
|
# class CreditCard < ActiveRecord::Base
|
38
39
|
# # Strip everything but digits, so the user can specify "555 234 34" or
|
39
|
-
# # "5552-3434"
|
40
|
-
# before_validation(:
|
40
|
+
# # "5552-3434" and both will mean "55523434"
|
41
|
+
# before_validation(on: :create) do
|
41
42
|
# self.number = number.gsub(/[^0-9]/, "") if attribute_present?("number")
|
42
43
|
# end
|
43
44
|
# end
|
@@ -85,7 +86,7 @@ module ActiveRecord
|
|
85
86
|
#
|
86
87
|
# In that case, <tt>Reply#destroy</tt> would only run +destroy_readers+ and _not_ +destroy_author+.
|
87
88
|
# So, use the callback macros when you want to ensure that a certain callback is called for the entire
|
88
|
-
# hierarchy, and use the regular
|
89
|
+
# hierarchy, and use the regular overwritable methods when you want to leave it up to each descendant
|
89
90
|
# to decide whether they want to call +super+ and trigger the inherited callbacks.
|
90
91
|
#
|
91
92
|
# *IMPORTANT:* In order for inheritance to work for the callback queues, you must specify the
|
@@ -127,7 +128,7 @@ module ActiveRecord
|
|
127
128
|
# record.credit_card_number = decrypt(record.credit_card_number)
|
128
129
|
# end
|
129
130
|
#
|
130
|
-
# alias_method :
|
131
|
+
# alias_method :after_initialize, :after_save
|
131
132
|
#
|
132
133
|
# private
|
133
134
|
# def encrypt(value)
|
@@ -162,7 +163,7 @@ module ActiveRecord
|
|
162
163
|
# record.send("#{@attribute}=", decrypt(record.send("#{@attribute}")))
|
163
164
|
# end
|
164
165
|
#
|
165
|
-
# alias_method :
|
166
|
+
# alias_method :after_initialize, :after_save
|
166
167
|
#
|
167
168
|
# private
|
168
169
|
# def encrypt(value)
|
@@ -202,6 +203,40 @@ module ActiveRecord
|
|
202
203
|
# Callbacks are generally run in the order they are defined, with the exception of callbacks defined as
|
203
204
|
# methods on the model, which are called last.
|
204
205
|
#
|
206
|
+
# == Ordering callbacks
|
207
|
+
#
|
208
|
+
# Sometimes the code needs that the callbacks execute in a specific order. For example, a +before_destroy+
|
209
|
+
# callback (+log_children+ in this case) should be executed before the children get destroyed by the +dependent: destroy+ option.
|
210
|
+
#
|
211
|
+
# Let's look at the code below:
|
212
|
+
#
|
213
|
+
# class Topic < ActiveRecord::Base
|
214
|
+
# has_many :children, dependent: destroy
|
215
|
+
#
|
216
|
+
# before_destroy :log_children
|
217
|
+
#
|
218
|
+
# private
|
219
|
+
# def log_children
|
220
|
+
# # Child processing
|
221
|
+
# end
|
222
|
+
# end
|
223
|
+
#
|
224
|
+
# In this case, the problem is that when the +before_destroy+ callback is executed, the children are not available
|
225
|
+
# because the +destroy+ callback gets executed first. You can use the +prepend+ option on the +before_destroy+ callback to avoid this.
|
226
|
+
#
|
227
|
+
# class Topic < ActiveRecord::Base
|
228
|
+
# has_many :children, dependent: destroy
|
229
|
+
#
|
230
|
+
# before_destroy :log_children, prepend: true
|
231
|
+
#
|
232
|
+
# private
|
233
|
+
# def log_children
|
234
|
+
# # Child processing
|
235
|
+
# end
|
236
|
+
# end
|
237
|
+
#
|
238
|
+
# This way, the +before_destroy+ gets executed before the <tt>dependent: destroy</tt> is called, and the data is still available.
|
239
|
+
#
|
205
240
|
# == Transactions
|
206
241
|
#
|
207
242
|
# The entire callback chain of a +save+, <tt>save!</tt>, or +destroy+ call runs
|
@@ -215,23 +250,23 @@ module ActiveRecord
|
|
215
250
|
# instead of quietly returning +false+.
|
216
251
|
#
|
217
252
|
# == Debugging callbacks
|
218
|
-
#
|
219
|
-
# The callback chain is accessible via the <tt>_*_callbacks</tt> method on an object. ActiveModel Callbacks support
|
253
|
+
#
|
254
|
+
# The callback chain is accessible via the <tt>_*_callbacks</tt> method on an object. ActiveModel Callbacks support
|
220
255
|
# <tt>:before</tt>, <tt>:after</tt> and <tt>:around</tt> as values for the <tt>kind</tt> property. The <tt>kind</tt> property
|
221
256
|
# defines what part of the chain the callback runs in.
|
222
|
-
#
|
223
|
-
# To find all callbacks in the before_save callback chain:
|
224
|
-
#
|
257
|
+
#
|
258
|
+
# To find all callbacks in the before_save callback chain:
|
259
|
+
#
|
225
260
|
# Topic._save_callbacks.select { |cb| cb.kind.eql?(:before) }
|
226
|
-
#
|
261
|
+
#
|
227
262
|
# Returns an array of callback objects that form the before_save chain.
|
228
|
-
#
|
263
|
+
#
|
229
264
|
# To further check if the before_save chain contains a proc defined as <tt>rest_when_dead</tt> use the <tt>filter</tt> property of the callback object:
|
230
|
-
#
|
265
|
+
#
|
231
266
|
# Topic._save_callbacks.select { |cb| cb.kind.eql?(:before) }.collect(&:filter).include?(:rest_when_dead)
|
232
|
-
#
|
267
|
+
#
|
233
268
|
# Returns true or false depending on whether the proc is contained in the before_save callback chain on a Topic model.
|
234
|
-
#
|
269
|
+
#
|
235
270
|
module Callbacks
|
236
271
|
extend ActiveSupport::Concern
|
237
272
|
|
@@ -242,8 +277,11 @@ module ActiveRecord
|
|
242
277
|
:before_destroy, :around_destroy, :after_destroy, :after_commit, :after_rollback
|
243
278
|
]
|
244
279
|
|
280
|
+
module ClassMethods
|
281
|
+
include ActiveModel::Callbacks
|
282
|
+
end
|
283
|
+
|
245
284
|
included do
|
246
|
-
extend ActiveModel::Callbacks
|
247
285
|
include ActiveModel::Validations::Callbacks
|
248
286
|
|
249
287
|
define_model_callbacks :initialize, :find, :touch, :only => :after
|
@@ -264,11 +302,11 @@ module ActiveRecord
|
|
264
302
|
run_callbacks(:save) { super }
|
265
303
|
end
|
266
304
|
|
267
|
-
def
|
305
|
+
def _create_record #:nodoc:
|
268
306
|
run_callbacks(:create) { super }
|
269
307
|
end
|
270
308
|
|
271
|
-
def
|
309
|
+
def _update_record(*) #:nodoc:
|
272
310
|
run_callbacks(:update) { super }
|
273
311
|
end
|
274
312
|
end
|
@@ -1,12 +1,8 @@
|
|
1
|
-
|
2
|
-
# :stopdoc:
|
3
|
-
module Coders
|
4
|
-
class YAMLColumn
|
5
|
-
RESCUE_ERRORS = [ ArgumentError ]
|
1
|
+
require 'yaml'
|
6
2
|
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
module ActiveRecord
|
4
|
+
module Coders # :nodoc:
|
5
|
+
class YAMLColumn # :nodoc:
|
10
6
|
|
11
7
|
attr_accessor :object_class
|
12
8
|
|
@@ -15,27 +11,28 @@ module ActiveRecord
|
|
15
11
|
end
|
16
12
|
|
17
13
|
def dump(obj)
|
14
|
+
return if obj.nil?
|
15
|
+
|
16
|
+
unless obj.is_a?(object_class)
|
17
|
+
raise SerializationTypeMismatch,
|
18
|
+
"Attribute was supposed to be a #{object_class}, but was a #{obj.class}. -- #{obj.inspect}"
|
19
|
+
end
|
18
20
|
YAML.dump obj
|
19
21
|
end
|
20
22
|
|
21
23
|
def load(yaml)
|
22
24
|
return object_class.new if object_class != Object && yaml.nil?
|
23
25
|
return yaml unless yaml.is_a?(String) && yaml =~ /^---/
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
"Attribute was supposed to be a #{object_class}, but was a #{obj.class}"
|
30
|
-
end
|
31
|
-
obj ||= object_class.new if object_class != Object
|
32
|
-
|
33
|
-
obj
|
34
|
-
rescue *RESCUE_ERRORS
|
35
|
-
yaml
|
26
|
+
obj = YAML.load(yaml)
|
27
|
+
|
28
|
+
unless obj.is_a?(object_class) || obj.nil?
|
29
|
+
raise SerializationTypeMismatch,
|
30
|
+
"Attribute was supposed to be a #{object_class}, but was a #{obj.class}"
|
36
31
|
end
|
32
|
+
obj ||= object_class.new if object_class != Object
|
33
|
+
|
34
|
+
obj
|
37
35
|
end
|
38
36
|
end
|
39
37
|
end
|
40
|
-
# :startdoc
|
41
38
|
end
|