activerecord 3.0.0 → 4.0.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.
Potentially problematic release.
This version of activerecord might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/CHANGELOG.md +2102 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +35 -44
- data/examples/performance.rb +110 -100
- data/lib/active_record/aggregations.rb +59 -75
- data/lib/active_record/associations/alias_tracker.rb +76 -0
- data/lib/active_record/associations/association.rb +248 -0
- data/lib/active_record/associations/association_scope.rb +135 -0
- data/lib/active_record/associations/belongs_to_association.rb +60 -59
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +16 -59
- data/lib/active_record/associations/builder/association.rb +108 -0
- data/lib/active_record/associations/builder/belongs_to.rb +98 -0
- data/lib/active_record/associations/builder/collection_association.rb +89 -0
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +39 -0
- data/lib/active_record/associations/builder/has_many.rb +15 -0
- data/lib/active_record/associations/builder/has_one.rb +25 -0
- data/lib/active_record/associations/builder/singular_association.rb +32 -0
- data/lib/active_record/associations/collection_association.rb +608 -0
- data/lib/active_record/associations/collection_proxy.rb +986 -0
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +40 -112
- data/lib/active_record/associations/has_many_association.rb +83 -76
- data/lib/active_record/associations/has_many_through_association.rb +147 -66
- data/lib/active_record/associations/has_one_association.rb +67 -108
- data/lib/active_record/associations/has_one_through_association.rb +21 -25
- data/lib/active_record/associations/join_dependency/join_association.rb +174 -0
- data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
- data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
- data/lib/active_record/associations/join_dependency.rb +235 -0
- data/lib/active_record/associations/join_helper.rb +45 -0
- data/lib/active_record/associations/preloader/association.rb +121 -0
- data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
- data/lib/active_record/associations/preloader/collection_association.rb +24 -0
- data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
- data/lib/active_record/associations/preloader/has_many.rb +17 -0
- data/lib/active_record/associations/preloader/has_many_through.rb +19 -0
- data/lib/active_record/associations/preloader/has_one.rb +23 -0
- data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
- data/lib/active_record/associations/preloader/singular_association.rb +21 -0
- data/lib/active_record/associations/preloader/through_association.rb +63 -0
- data/lib/active_record/associations/preloader.rb +178 -0
- data/lib/active_record/associations/singular_association.rb +64 -0
- data/lib/active_record/associations/through_association.rb +87 -0
- data/lib/active_record/associations.rb +512 -1224
- data/lib/active_record/attribute_assignment.rb +201 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +49 -12
- data/lib/active_record/attribute_methods/dirty.rb +51 -28
- data/lib/active_record/attribute_methods/primary_key.rb +94 -22
- data/lib/active_record/attribute_methods/query.rb +5 -4
- data/lib/active_record/attribute_methods/read.rb +63 -72
- data/lib/active_record/attribute_methods/serialization.rb +162 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -41
- data/lib/active_record/attribute_methods/write.rb +39 -13
- data/lib/active_record/attribute_methods.rb +362 -29
- data/lib/active_record/autosave_association.rb +132 -75
- data/lib/active_record/base.rb +83 -1627
- data/lib/active_record/callbacks.rb +69 -47
- data/lib/active_record/coders/yaml_column.rb +38 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +411 -138
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +21 -11
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +234 -173
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +36 -22
- data/lib/active_record/connection_adapters/abstract/quoting.rb +82 -25
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +176 -414
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +70 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +562 -232
- data/lib/active_record/connection_adapters/abstract/transaction.rb +203 -0
- data/lib/active_record/connection_adapters/abstract_adapter.rb +281 -53
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +782 -0
- data/lib/active_record/connection_adapters/column.rb +318 -0
- data/lib/active_record/connection_adapters/connection_specification.rb +96 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +273 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +365 -450
- data/lib/active_record/connection_adapters/postgresql/array_parser.rb +97 -0
- data/lib/active_record/connection_adapters/postgresql/cast.rb +152 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +242 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +366 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +171 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +489 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +672 -752
- data/lib/active_record/connection_adapters/schema_cache.rb +129 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +588 -17
- data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
- data/lib/active_record/connection_handling.rb +98 -0
- data/lib/active_record/core.rb +463 -0
- data/lib/active_record/counter_cache.rb +108 -101
- data/lib/active_record/dynamic_matchers.rb +131 -0
- data/lib/active_record/errors.rb +54 -13
- data/lib/active_record/explain.rb +38 -0
- data/lib/active_record/explain_registry.rb +30 -0
- data/lib/active_record/explain_subscriber.rb +29 -0
- data/lib/active_record/fixture_set/file.rb +55 -0
- data/lib/active_record/fixtures.rb +703 -785
- data/lib/active_record/inheritance.rb +200 -0
- data/lib/active_record/integration.rb +60 -0
- data/lib/active_record/locale/en.yml +8 -1
- data/lib/active_record/locking/optimistic.rb +69 -60
- data/lib/active_record/locking/pessimistic.rb +34 -12
- data/lib/active_record/log_subscriber.rb +40 -6
- data/lib/active_record/migration/command_recorder.rb +164 -0
- data/lib/active_record/migration/join_table.rb +15 -0
- data/lib/active_record/migration.rb +614 -216
- data/lib/active_record/model_schema.rb +345 -0
- data/lib/active_record/nested_attributes.rb +248 -119
- data/lib/active_record/null_relation.rb +65 -0
- data/lib/active_record/persistence.rb +275 -57
- data/lib/active_record/query_cache.rb +29 -9
- data/lib/active_record/querying.rb +62 -0
- data/lib/active_record/railtie.rb +135 -21
- data/lib/active_record/railties/console_sandbox.rb +5 -0
- data/lib/active_record/railties/controller_runtime.rb +17 -5
- data/lib/active_record/railties/databases.rake +249 -359
- data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
- data/lib/active_record/readonly_attributes.rb +30 -0
- data/lib/active_record/reflection.rb +283 -103
- data/lib/active_record/relation/batches.rb +38 -34
- data/lib/active_record/relation/calculations.rb +252 -139
- data/lib/active_record/relation/delegation.rb +125 -0
- data/lib/active_record/relation/finder_methods.rb +182 -188
- data/lib/active_record/relation/merger.rb +161 -0
- data/lib/active_record/relation/predicate_builder.rb +86 -21
- data/lib/active_record/relation/query_methods.rb +917 -134
- data/lib/active_record/relation/spawn_methods.rb +53 -92
- data/lib/active_record/relation.rb +405 -143
- data/lib/active_record/result.rb +67 -0
- data/lib/active_record/runtime_registry.rb +17 -0
- data/lib/active_record/sanitization.rb +168 -0
- data/lib/active_record/schema.rb +20 -14
- data/lib/active_record/schema_dumper.rb +55 -46
- data/lib/active_record/schema_migration.rb +39 -0
- data/lib/active_record/scoping/default.rb +146 -0
- data/lib/active_record/scoping/named.rb +175 -0
- data/lib/active_record/scoping.rb +82 -0
- data/lib/active_record/serialization.rb +8 -46
- data/lib/active_record/serializers/xml_serializer.rb +21 -68
- data/lib/active_record/statement_cache.rb +26 -0
- data/lib/active_record/store.rb +156 -0
- data/lib/active_record/tasks/database_tasks.rb +203 -0
- data/lib/active_record/tasks/firebird_database_tasks.rb +56 -0
- data/lib/active_record/tasks/mysql_database_tasks.rb +143 -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 +57 -28
- data/lib/active_record/timestamp.rb +49 -18
- data/lib/active_record/transactions.rb +106 -63
- data/lib/active_record/translation.rb +22 -0
- data/lib/active_record/validations/associated.rb +25 -24
- data/lib/active_record/validations/presence.rb +65 -0
- data/lib/active_record/validations/uniqueness.rb +123 -83
- data/lib/active_record/validations.rb +29 -29
- data/lib/active_record/version.rb +7 -5
- data/lib/active_record.rb +83 -34
- data/lib/rails/generators/active_record/migration/migration_generator.rb +46 -9
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +19 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb +30 -8
- data/lib/rails/generators/active_record/model/model_generator.rb +15 -5
- data/lib/rails/generators/active_record/model/templates/model.rb +7 -2
- data/lib/rails/generators/active_record/model/templates/module.rb +3 -1
- data/lib/rails/generators/active_record.rb +4 -8
- metadata +163 -121
- data/CHANGELOG +0 -6023
- data/examples/associations.png +0 -0
- data/lib/active_record/association_preload.rb +0 -403
- data/lib/active_record/associations/association_collection.rb +0 -562
- data/lib/active_record/associations/association_proxy.rb +0 -295
- data/lib/active_record/associations/through_association_scope.rb +0 -154
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +0 -113
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +0 -401
- data/lib/active_record/dynamic_finder_match.rb +0 -53
- data/lib/active_record/dynamic_scope_match.rb +0 -32
- data/lib/active_record/named_scope.rb +0 -138
- data/lib/active_record/observer.rb +0 -140
- data/lib/active_record/session_store.rb +0 -340
- data/lib/rails/generators/active_record/model/templates/migration.rb +0 -16
- data/lib/rails/generators/active_record/observer/observer_generator.rb +0 -15
- data/lib/rails/generators/active_record/observer/templates/observer.rb +0 -2
- data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +0 -24
- data/lib/rails/generators/active_record/session_migration/templates/migration.rb +0 -16
@@ -0,0 +1,164 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
class Migration
|
3
|
+
# <tt>ActiveRecord::Migration::CommandRecorder</tt> records commands done during
|
4
|
+
# a migration and knows how to reverse those commands. The CommandRecorder
|
5
|
+
# knows how to invert the following commands:
|
6
|
+
#
|
7
|
+
# * add_column
|
8
|
+
# * add_index
|
9
|
+
# * add_timestamps
|
10
|
+
# * create_table
|
11
|
+
# * create_join_table
|
12
|
+
# * remove_timestamps
|
13
|
+
# * rename_column
|
14
|
+
# * rename_index
|
15
|
+
# * rename_table
|
16
|
+
class CommandRecorder
|
17
|
+
include JoinTable
|
18
|
+
|
19
|
+
attr_accessor :commands, :delegate, :reverting
|
20
|
+
|
21
|
+
def initialize(delegate = nil)
|
22
|
+
@commands = []
|
23
|
+
@delegate = delegate
|
24
|
+
@reverting = false
|
25
|
+
end
|
26
|
+
|
27
|
+
# While executing the given block, the recorded will be in reverting mode.
|
28
|
+
# All commands recorded will end up being recorded reverted
|
29
|
+
# and in reverse order.
|
30
|
+
# For example:
|
31
|
+
#
|
32
|
+
# recorder.revert{ recorder.record(:rename_table, [:old, :new]) }
|
33
|
+
# # same effect as recorder.record(:rename_table, [:new, :old])
|
34
|
+
def revert
|
35
|
+
@reverting = !@reverting
|
36
|
+
previous = @commands
|
37
|
+
@commands = []
|
38
|
+
yield
|
39
|
+
ensure
|
40
|
+
@commands = previous.concat(@commands.reverse)
|
41
|
+
@reverting = !@reverting
|
42
|
+
end
|
43
|
+
|
44
|
+
# record +command+. +command+ should be a method name and arguments.
|
45
|
+
# For example:
|
46
|
+
#
|
47
|
+
# recorder.record(:method_name, [:arg1, :arg2])
|
48
|
+
def record(*command, &block)
|
49
|
+
if @reverting
|
50
|
+
@commands << inverse_of(*command, &block)
|
51
|
+
else
|
52
|
+
@commands << (command << block)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Returns the inverse of the given command. For example:
|
57
|
+
#
|
58
|
+
# recorder.inverse_of(:rename_table, [:old, :new])
|
59
|
+
# # => [:rename_table, [:new, :old]]
|
60
|
+
#
|
61
|
+
# This method will raise an +IrreversibleMigration+ exception if it cannot
|
62
|
+
# invert the +command+.
|
63
|
+
def inverse_of(command, args, &block)
|
64
|
+
method = :"invert_#{command}"
|
65
|
+
raise IrreversibleMigration unless respond_to?(method, true)
|
66
|
+
send(method, args, &block)
|
67
|
+
end
|
68
|
+
|
69
|
+
def respond_to?(*args) # :nodoc:
|
70
|
+
super || delegate.respond_to?(*args)
|
71
|
+
end
|
72
|
+
|
73
|
+
[:create_table, :create_join_table, :rename_table, :add_column, :remove_column,
|
74
|
+
:rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,
|
75
|
+
:change_column_default, :add_reference, :remove_reference, :transaction,
|
76
|
+
:drop_join_table, :drop_table, :execute_block,
|
77
|
+
:change_column, :execute, :remove_columns, # irreversible methods need to be here too
|
78
|
+
].each do |method|
|
79
|
+
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
80
|
+
def #{method}(*args, &block) # def create_table(*args, &block)
|
81
|
+
record(:"#{method}", args, &block) # record(:create_table, args, &block)
|
82
|
+
end # end
|
83
|
+
EOV
|
84
|
+
end
|
85
|
+
alias :add_belongs_to :add_reference
|
86
|
+
alias :remove_belongs_to :remove_reference
|
87
|
+
|
88
|
+
def change_table(table_name, options = {})
|
89
|
+
yield ConnectionAdapters::Table.new(table_name, self)
|
90
|
+
end
|
91
|
+
|
92
|
+
private
|
93
|
+
|
94
|
+
module StraightReversions
|
95
|
+
private
|
96
|
+
{ transaction: :transaction,
|
97
|
+
execute_block: :execute_block,
|
98
|
+
create_table: :drop_table,
|
99
|
+
create_join_table: :drop_join_table,
|
100
|
+
add_column: :remove_column,
|
101
|
+
add_timestamps: :remove_timestamps,
|
102
|
+
add_reference: :remove_reference,
|
103
|
+
}.each do |cmd, inv|
|
104
|
+
[[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
|
105
|
+
class_eval <<-EOV, __FILE__, __LINE__ + 1
|
106
|
+
def invert_#{method}(args, &block) # def invert_create_table(args, &block)
|
107
|
+
[:#{inverse}, args, block] # [:drop_table, args, block]
|
108
|
+
end # end
|
109
|
+
EOV
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
include StraightReversions
|
115
|
+
|
116
|
+
def invert_drop_table(args, &block)
|
117
|
+
if args.size == 1 && block == nil
|
118
|
+
raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
|
119
|
+
end
|
120
|
+
super
|
121
|
+
end
|
122
|
+
|
123
|
+
def invert_rename_table(args)
|
124
|
+
[:rename_table, args.reverse]
|
125
|
+
end
|
126
|
+
|
127
|
+
def invert_remove_column(args)
|
128
|
+
raise ActiveRecord::IrreversibleMigration, "remove_column is only reversible if given a type." if args.size <= 2
|
129
|
+
super
|
130
|
+
end
|
131
|
+
|
132
|
+
def invert_rename_index(args)
|
133
|
+
[:rename_index, [args.first] + args.last(2).reverse]
|
134
|
+
end
|
135
|
+
|
136
|
+
def invert_rename_column(args)
|
137
|
+
[:rename_column, [args.first] + args.last(2).reverse]
|
138
|
+
end
|
139
|
+
|
140
|
+
def invert_add_index(args)
|
141
|
+
table, columns, options = *args
|
142
|
+
[:remove_index, [table, (options || {}).merge(column: columns)]]
|
143
|
+
end
|
144
|
+
|
145
|
+
def invert_remove_index(args)
|
146
|
+
table, options = *args
|
147
|
+
raise ActiveRecord::IrreversibleMigration, "remove_index is only reversible if given a :column option." unless options && options[:column]
|
148
|
+
|
149
|
+
options = options.dup
|
150
|
+
[:add_index, [table, options.delete(:column), options]]
|
151
|
+
end
|
152
|
+
|
153
|
+
alias :invert_add_belongs_to :invert_add_reference
|
154
|
+
alias :invert_remove_belongs_to :invert_remove_reference
|
155
|
+
|
156
|
+
# Forwards any missing method call to the \target.
|
157
|
+
def method_missing(method, *args, &block)
|
158
|
+
@delegate.send(method, *args, &block)
|
159
|
+
rescue NoMethodError => e
|
160
|
+
raise e, e.message.sub(/ for #<.*$/, " via proxy for #{@delegate}")
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ActiveRecord
|
2
|
+
class Migration
|
3
|
+
module JoinTable #:nodoc:
|
4
|
+
private
|
5
|
+
|
6
|
+
def find_join_table_name(table_1, table_2, options = {})
|
7
|
+
options.delete(:table_name) || join_table_name(table_1, table_2)
|
8
|
+
end
|
9
|
+
|
10
|
+
def join_table_name(table_1, table_2)
|
11
|
+
[table_1.to_s, table_2.to_s].sort.join("_").to_sym
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|