activerecord 5.0.7 → 5.1.7

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.

Files changed (219) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +657 -2080
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/examples/performance.rb +28 -28
  6. data/examples/simple.rb +3 -3
  7. data/lib/active_record/aggregations.rb +244 -244
  8. data/lib/active_record/association_relation.rb +5 -5
  9. data/lib/active_record/associations/alias_tracker.rb +10 -11
  10. data/lib/active_record/associations/association.rb +23 -5
  11. data/lib/active_record/associations/association_scope.rb +95 -81
  12. data/lib/active_record/associations/belongs_to_association.rb +7 -4
  13. data/lib/active_record/associations/builder/belongs_to.rb +30 -16
  14. data/lib/active_record/associations/builder/collection_association.rb +1 -2
  15. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +27 -27
  16. data/lib/active_record/associations/collection_association.rb +36 -205
  17. data/lib/active_record/associations/collection_proxy.rb +132 -63
  18. data/lib/active_record/associations/has_many_association.rb +10 -19
  19. data/lib/active_record/associations/has_many_through_association.rb +12 -4
  20. data/lib/active_record/associations/has_one_association.rb +24 -28
  21. data/lib/active_record/associations/has_one_through_association.rb +5 -1
  22. data/lib/active_record/associations/join_dependency/join_association.rb +4 -28
  23. data/lib/active_record/associations/join_dependency/join_base.rb +1 -1
  24. data/lib/active_record/associations/join_dependency/join_part.rb +1 -1
  25. data/lib/active_record/associations/join_dependency.rb +121 -118
  26. data/lib/active_record/associations/preloader/association.rb +64 -64
  27. data/lib/active_record/associations/preloader/belongs_to.rb +0 -2
  28. data/lib/active_record/associations/preloader/collection_association.rb +6 -6
  29. data/lib/active_record/associations/preloader/has_many.rb +0 -2
  30. data/lib/active_record/associations/preloader/singular_association.rb +6 -8
  31. data/lib/active_record/associations/preloader/through_association.rb +41 -41
  32. data/lib/active_record/associations/preloader.rb +94 -94
  33. data/lib/active_record/associations/singular_association.rb +8 -25
  34. data/lib/active_record/associations/through_association.rb +2 -5
  35. data/lib/active_record/associations.rb +1591 -1562
  36. data/lib/active_record/attribute/user_provided_default.rb +4 -2
  37. data/lib/active_record/attribute.rb +98 -71
  38. data/lib/active_record/attribute_assignment.rb +61 -61
  39. data/lib/active_record/attribute_decorators.rb +35 -13
  40. data/lib/active_record/attribute_methods/before_type_cast.rb +7 -7
  41. data/lib/active_record/attribute_methods/dirty.rb +229 -46
  42. data/lib/active_record/attribute_methods/primary_key.rb +74 -73
  43. data/lib/active_record/attribute_methods/read.rb +39 -35
  44. data/lib/active_record/attribute_methods/serialization.rb +7 -7
  45. data/lib/active_record/attribute_methods/time_zone_conversion.rb +35 -58
  46. data/lib/active_record/attribute_methods/write.rb +30 -33
  47. data/lib/active_record/attribute_methods.rb +56 -65
  48. data/lib/active_record/attribute_mutation_tracker.rb +63 -11
  49. data/lib/active_record/attribute_set/builder.rb +27 -33
  50. data/lib/active_record/attribute_set/yaml_encoder.rb +41 -0
  51. data/lib/active_record/attribute_set.rb +9 -6
  52. data/lib/active_record/attributes.rb +22 -22
  53. data/lib/active_record/autosave_association.rb +18 -13
  54. data/lib/active_record/base.rb +24 -22
  55. data/lib/active_record/callbacks.rb +56 -14
  56. data/lib/active_record/coders/yaml_column.rb +9 -11
  57. data/lib/active_record/collection_cache_key.rb +3 -4
  58. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +330 -284
  59. data/lib/active_record/connection_adapters/abstract/database_limits.rb +1 -3
  60. data/lib/active_record/connection_adapters/abstract/database_statements.rb +39 -37
  61. data/lib/active_record/connection_adapters/abstract/query_cache.rb +32 -27
  62. data/lib/active_record/connection_adapters/abstract/quoting.rb +62 -51
  63. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +10 -20
  64. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +74 -79
  65. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +53 -41
  66. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +120 -100
  67. data/lib/active_record/connection_adapters/abstract/transaction.rb +49 -43
  68. data/lib/active_record/connection_adapters/abstract_adapter.rb +165 -135
  69. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +404 -424
  70. data/lib/active_record/connection_adapters/column.rb +26 -4
  71. data/lib/active_record/connection_adapters/connection_specification.rb +128 -118
  72. data/lib/active_record/connection_adapters/mysql/column.rb +6 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +36 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +22 -22
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +6 -12
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +16 -19
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +54 -28
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +43 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +7 -6
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +23 -27
  82. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +32 -53
  83. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +3 -3
  84. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +19 -9
  85. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +5 -3
  86. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +1 -1
  87. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +2 -2
  88. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +1 -1
  89. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +3 -3
  90. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +16 -16
  91. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +0 -10
  92. data/lib/active_record/connection_adapters/postgresql/oid/{rails_5_1_point.rb → legacy_point.rb} +9 -16
  93. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +2 -2
  94. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +13 -0
  95. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +28 -8
  96. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +32 -30
  97. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +2 -1
  98. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +51 -51
  99. data/lib/active_record/connection_adapters/postgresql/oid.rb +22 -21
  100. data/lib/active_record/connection_adapters/postgresql/quoting.rb +40 -35
  101. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +15 -0
  102. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +37 -24
  103. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +19 -23
  104. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +182 -222
  105. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +6 -4
  106. data/lib/active_record/connection_adapters/postgresql/utils.rb +7 -5
  107. data/lib/active_record/connection_adapters/postgresql_adapter.rb +198 -167
  108. data/lib/active_record/connection_adapters/schema_cache.rb +16 -7
  109. data/lib/active_record/connection_adapters/sql_type_metadata.rb +3 -3
  110. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +1 -1
  111. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +16 -19
  112. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +1 -8
  113. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +28 -0
  114. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +17 -0
  115. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +32 -0
  116. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +184 -167
  117. data/lib/active_record/connection_adapters/statement_pool.rb +7 -7
  118. data/lib/active_record/connection_handling.rb +14 -26
  119. data/lib/active_record/core.rb +109 -93
  120. data/lib/active_record/counter_cache.rb +60 -13
  121. data/lib/active_record/define_callbacks.rb +20 -0
  122. data/lib/active_record/dynamic_matchers.rb +80 -79
  123. data/lib/active_record/enum.rb +8 -6
  124. data/lib/active_record/errors.rb +64 -15
  125. data/lib/active_record/explain.rb +1 -2
  126. data/lib/active_record/explain_registry.rb +1 -1
  127. data/lib/active_record/explain_subscriber.rb +7 -4
  128. data/lib/active_record/fixture_set/file.rb +11 -8
  129. data/lib/active_record/fixtures.rb +66 -53
  130. data/lib/active_record/gem_version.rb +1 -1
  131. data/lib/active_record/inheritance.rb +93 -79
  132. data/lib/active_record/integration.rb +7 -7
  133. data/lib/active_record/internal_metadata.rb +3 -16
  134. data/lib/active_record/legacy_yaml_adapter.rb +1 -1
  135. data/lib/active_record/locking/optimistic.rb +69 -74
  136. data/lib/active_record/locking/pessimistic.rb +10 -1
  137. data/lib/active_record/log_subscriber.rb +23 -28
  138. data/lib/active_record/migration/command_recorder.rb +94 -94
  139. data/lib/active_record/migration/compatibility.rb +100 -47
  140. data/lib/active_record/migration/join_table.rb +6 -6
  141. data/lib/active_record/migration.rb +153 -155
  142. data/lib/active_record/model_schema.rb +94 -107
  143. data/lib/active_record/nested_attributes.rb +200 -199
  144. data/lib/active_record/null_relation.rb +11 -34
  145. data/lib/active_record/persistence.rb +65 -50
  146. data/lib/active_record/query_cache.rb +2 -6
  147. data/lib/active_record/querying.rb +3 -4
  148. data/lib/active_record/railtie.rb +16 -17
  149. data/lib/active_record/railties/controller_runtime.rb +6 -2
  150. data/lib/active_record/railties/databases.rake +105 -133
  151. data/lib/active_record/railties/jdbcmysql_error.rb +1 -1
  152. data/lib/active_record/readonly_attributes.rb +2 -2
  153. data/lib/active_record/reflection.rb +154 -108
  154. data/lib/active_record/relation/batches/batch_enumerator.rb +1 -1
  155. data/lib/active_record/relation/batches.rb +80 -51
  156. data/lib/active_record/relation/calculations.rb +169 -162
  157. data/lib/active_record/relation/delegation.rb +32 -31
  158. data/lib/active_record/relation/finder_methods.rb +197 -231
  159. data/lib/active_record/relation/merger.rb +58 -62
  160. data/lib/active_record/relation/predicate_builder/array_handler.rb +7 -5
  161. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +23 -23
  162. data/lib/active_record/relation/predicate_builder/base_handler.rb +3 -1
  163. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +0 -8
  164. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +12 -10
  165. data/lib/active_record/relation/predicate_builder/range_handler.rb +0 -8
  166. data/lib/active_record/relation/predicate_builder.rb +92 -89
  167. data/lib/active_record/relation/query_attribute.rb +1 -1
  168. data/lib/active_record/relation/query_methods.rb +255 -293
  169. data/lib/active_record/relation/record_fetch_warning.rb +3 -3
  170. data/lib/active_record/relation/spawn_methods.rb +4 -5
  171. data/lib/active_record/relation/where_clause.rb +80 -65
  172. data/lib/active_record/relation/where_clause_factory.rb +47 -8
  173. data/lib/active_record/relation.rb +93 -119
  174. data/lib/active_record/result.rb +41 -32
  175. data/lib/active_record/runtime_registry.rb +3 -3
  176. data/lib/active_record/sanitization.rb +176 -192
  177. data/lib/active_record/schema.rb +3 -3
  178. data/lib/active_record/schema_dumper.rb +15 -38
  179. data/lib/active_record/schema_migration.rb +8 -4
  180. data/lib/active_record/scoping/default.rb +90 -90
  181. data/lib/active_record/scoping/named.rb +11 -11
  182. data/lib/active_record/scoping.rb +6 -6
  183. data/lib/active_record/secure_token.rb +2 -2
  184. data/lib/active_record/statement_cache.rb +13 -15
  185. data/lib/active_record/store.rb +31 -32
  186. data/lib/active_record/suppressor.rb +2 -1
  187. data/lib/active_record/table_metadata.rb +9 -5
  188. data/lib/active_record/tasks/database_tasks.rb +65 -55
  189. data/lib/active_record/tasks/mysql_database_tasks.rb +76 -73
  190. data/lib/active_record/tasks/postgresql_database_tasks.rb +72 -47
  191. data/lib/active_record/tasks/sqlite_database_tasks.rb +18 -16
  192. data/lib/active_record/timestamp.rb +46 -25
  193. data/lib/active_record/touch_later.rb +1 -2
  194. data/lib/active_record/transactions.rb +97 -109
  195. data/lib/active_record/type/adapter_specific_registry.rb +46 -42
  196. data/lib/active_record/type/decimal_without_scale.rb +13 -0
  197. data/lib/active_record/type/hash_lookup_type_map.rb +3 -3
  198. data/lib/active_record/type/internal/abstract_json.rb +4 -0
  199. data/lib/active_record/type/serialized.rb +14 -8
  200. data/lib/active_record/type/text.rb +9 -0
  201. data/lib/active_record/type/time.rb +0 -1
  202. data/lib/active_record/type/type_map.rb +11 -15
  203. data/lib/active_record/type/unsigned_integer.rb +15 -0
  204. data/lib/active_record/type.rb +17 -13
  205. data/lib/active_record/type_caster/connection.rb +8 -6
  206. data/lib/active_record/type_caster/map.rb +3 -1
  207. data/lib/active_record/type_caster.rb +2 -2
  208. data/lib/active_record/validations/associated.rb +1 -1
  209. data/lib/active_record/validations/presence.rb +2 -2
  210. data/lib/active_record/validations/uniqueness.rb +8 -39
  211. data/lib/active_record/validations.rb +4 -4
  212. data/lib/active_record/version.rb +1 -1
  213. data/lib/active_record.rb +20 -20
  214. data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -34
  215. data/lib/rails/generators/active_record/migration.rb +1 -1
  216. data/lib/rails/generators/active_record/model/model_generator.rb +9 -9
  217. data/lib/rails/generators/active_record.rb +4 -4
  218. metadata +24 -13
  219. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
@@ -3,30 +3,37 @@ module ActiveRecord
3
3
  # Abstract representation of an index definition on a table. Instances of
4
4
  # this type are typically created and returned by methods in database
5
5
  # adapters. e.g. ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#indexes
6
- class IndexDefinition < Struct.new(:table, :name, :unique, :columns, :lengths, :orders, :where, :type, :using, :comment) #:nodoc:
7
- end
6
+ IndexDefinition = Struct.new(:table, :name, :unique, :columns, :lengths, :orders, :where, :type, :using, :comment) #:nodoc:
8
7
 
9
8
  # Abstract representation of a column definition. Instances of this type
10
9
  # are typically created by methods in TableDefinition, and added to the
11
10
  # +columns+ attribute of said TableDefinition object, in order to be used
12
11
  # for generating a number of table creation or table changing SQL statements.
13
- class ColumnDefinition < Struct.new(:name, :type, :limit, :precision, :scale, :default, :null, :first, :after, :auto_increment, :primary_key, :collation, :sql_type, :comment) #:nodoc:
14
-
12
+ ColumnDefinition = Struct.new(:name, :type, :options, :sql_type) do # :nodoc:
15
13
  def primary_key?
16
- primary_key || type.to_sym == :primary_key
14
+ options[:primary_key]
17
15
  end
18
- end
19
16
 
20
- class AddColumnDefinition < Struct.new(:column) # :nodoc:
21
- end
17
+ [:limit, :precision, :scale, :default, :null, :collation, :comment].each do |option_name|
18
+ module_eval <<-CODE, __FILE__, __LINE__ + 1
19
+ def #{option_name}
20
+ options[:#{option_name}]
21
+ end
22
22
 
23
- class ChangeColumnDefinition < Struct.new(:column, :name) #:nodoc:
23
+ def #{option_name}=(value)
24
+ options[:#{option_name}] = value
25
+ end
26
+ CODE
27
+ end
24
28
  end
25
29
 
26
- class PrimaryKeyDefinition < Struct.new(:name) # :nodoc:
27
- end
30
+ AddColumnDefinition = Struct.new(:column) # :nodoc:
28
31
 
29
- class ForeignKeyDefinition < Struct.new(:from_table, :to_table, :options) #:nodoc:
32
+ ChangeColumnDefinition = Struct.new(:column, :name) #:nodoc:
33
+
34
+ PrimaryKeyDefinition = Struct.new(:name) # :nodoc:
35
+
36
+ ForeignKeyDefinition = Struct.new(:from_table, :to_table, :options) do #:nodoc:
30
37
  def name
31
38
  options[:name]
32
39
  end
@@ -61,9 +68,9 @@ module ActiveRecord
61
68
  end
62
69
 
63
70
  private
64
- def default_primary_key
65
- "id"
66
- end
71
+ def default_primary_key
72
+ "id"
73
+ end
67
74
  end
68
75
 
69
76
  class ReferenceDefinition # :nodoc:
@@ -72,7 +79,7 @@ module ActiveRecord
72
79
  polymorphic: false,
73
80
  index: true,
74
81
  foreign_key: false,
75
- type: :integer,
82
+ type: :bigint,
76
83
  **options
77
84
  )
78
85
  @name = name
@@ -101,49 +108,51 @@ module ActiveRecord
101
108
  end
102
109
  end
103
110
 
111
+ # TODO Change this to private once we've dropped Ruby 2.2 support.
112
+ # Workaround for Ruby 2.2 "private attribute?" warning.
104
113
  protected
105
114
 
106
- attr_reader :name, :polymorphic, :index, :foreign_key, :type, :options
115
+ attr_reader :name, :polymorphic, :index, :foreign_key, :type, :options
107
116
 
108
117
  private
109
118
 
110
- def as_options(value)
111
- value.is_a?(Hash) ? value : {}
112
- end
119
+ def as_options(value)
120
+ value.is_a?(Hash) ? value : {}
121
+ end
113
122
 
114
- def polymorphic_options
115
- as_options(polymorphic).merge(null: options[:null])
116
- end
123
+ def polymorphic_options
124
+ as_options(polymorphic).merge(options.slice(:null, :first, :after))
125
+ end
117
126
 
118
- def index_options
119
- as_options(index)
120
- end
127
+ def index_options
128
+ as_options(index)
129
+ end
121
130
 
122
- def foreign_key_options
123
- as_options(foreign_key).merge(column: column_name)
124
- end
131
+ def foreign_key_options
132
+ as_options(foreign_key).merge(column: column_name)
133
+ end
125
134
 
126
- def columns
127
- result = [[column_name, type, options]]
128
- if polymorphic
129
- result.unshift(["#{name}_type", :string, polymorphic_options])
135
+ def columns
136
+ result = [[column_name, type, options]]
137
+ if polymorphic
138
+ result.unshift(["#{name}_type", :string, polymorphic_options])
139
+ end
140
+ result
130
141
  end
131
- result
132
- end
133
142
 
134
- def column_name
135
- "#{name}_id"
136
- end
143
+ def column_name
144
+ "#{name}_id"
145
+ end
137
146
 
138
- def column_names
139
- columns.map(&:first)
140
- end
147
+ def column_names
148
+ columns.map(&:first)
149
+ end
141
150
 
142
- def foreign_table_name
143
- foreign_key_options.fetch(:to_table) do
144
- Base.pluralize_table_names ? name.to_s.pluralize : name
151
+ def foreign_table_name
152
+ foreign_key_options.fetch(:to_table) do
153
+ Base.pluralize_table_names ? name.to_s.pluralize : name
154
+ end
145
155
  end
146
- end
147
156
  end
148
157
 
149
158
  module ColumnMethods
@@ -172,6 +181,7 @@ module ActiveRecord
172
181
  :text,
173
182
  :time,
174
183
  :timestamp,
184
+ :virtual,
175
185
  ].each do |column_type|
176
186
  module_eval <<-CODE, __FILE__, __LINE__ + 1
177
187
  def #{column_type}(*args, **options)
@@ -338,9 +348,7 @@ module ActiveRecord
338
348
  # <tt>:updated_at</tt> to the table. See {connection.add_timestamps}[rdoc-ref:SchemaStatements#add_timestamps]
339
349
  #
340
350
  # t.timestamps null: false
341
- def timestamps(*args)
342
- options = args.extract_options!
343
-
351
+ def timestamps(**options)
344
352
  options[:null] = false if options[:null].nil?
345
353
 
346
354
  column(:created_at, :datetime, options)
@@ -354,38 +362,27 @@ module ActiveRecord
354
362
  #
355
363
  # See {connection.add_reference}[rdoc-ref:SchemaStatements#add_reference] for details of the options you can use.
356
364
  def references(*args, **options)
357
- args.each do |col|
358
- ReferenceDefinition.new(col, **options).add_to(self)
365
+ args.each do |ref_name|
366
+ ReferenceDefinition.new(ref_name, options).add_to(self)
359
367
  end
360
368
  end
361
369
  alias :belongs_to :references
362
370
 
363
- def new_column_definition(name, type, options) # :nodoc:
371
+ def new_column_definition(name, type, **options) # :nodoc:
364
372
  type = aliased_types(type.to_s, type)
365
- column = create_column_definition name, type
366
-
367
- column.limit = options[:limit]
368
- column.precision = options[:precision]
369
- column.scale = options[:scale]
370
- column.default = options[:default]
371
- column.null = options[:null]
372
- column.first = options[:first]
373
- column.after = options[:after]
374
- column.auto_increment = options[:auto_increment]
375
- column.primary_key = type == :primary_key || options[:primary_key]
376
- column.collation = options[:collation]
377
- column.comment = options[:comment]
378
- column
373
+ options[:primary_key] ||= type == :primary_key
374
+ options[:null] = false if options[:primary_key]
375
+ create_column_definition(name, type, options)
379
376
  end
380
377
 
381
378
  private
382
- def create_column_definition(name, type)
383
- ColumnDefinition.new name, type
384
- end
379
+ def create_column_definition(name, type, options)
380
+ ColumnDefinition.new(name, type, options)
381
+ end
385
382
 
386
- def aliased_types(name, fallback)
387
- 'timestamp' == name ? :datetime : fallback
388
- end
383
+ def aliased_types(name, fallback)
384
+ "timestamp" == name ? :datetime : fallback
385
+ end
389
386
  end
390
387
 
391
388
  class AlterTable # :nodoc:
@@ -474,7 +471,7 @@ module ActiveRecord
474
471
 
475
472
  # Checks to see if a column exists.
476
473
  #
477
- # t.string(:name) unless t.column_exists?(:name, :string)
474
+ # t.string(:name) unless t.column_exists?(:name, :string)
478
475
  #
479
476
  # See {connection.column_exists?}[rdoc-ref:SchemaStatements#column_exists?]
480
477
  def column_exists?(column_name, type = nil, options = {})
@@ -495,9 +492,9 @@ module ActiveRecord
495
492
 
496
493
  # Checks to see if an index exists.
497
494
  #
498
- # unless t.index_exists?(:branch_id)
499
- # t.index(:branch_id)
500
- # end
495
+ # unless t.index_exists?(:branch_id)
496
+ # t.index(:branch_id)
497
+ # end
501
498
  #
502
499
  # See {connection.index_exists?}[rdoc-ref:SchemaStatements#index_exists?]
503
500
  def index_exists?(column_name, options = {})
@@ -588,8 +585,7 @@ module ActiveRecord
588
585
  # t.belongs_to(:supplier, foreign_key: true)
589
586
  #
590
587
  # See {connection.add_reference}[rdoc-ref:SchemaStatements#add_reference] for details of the options you can use.
591
- def references(*args)
592
- options = args.extract_options!
588
+ def references(*args, **options)
593
589
  args.each do |ref_name|
594
590
  @base.add_reference(name, ref_name, options)
595
591
  end
@@ -602,8 +598,7 @@ module ActiveRecord
602
598
  # t.remove_belongs_to(:supplier, polymorphic: true)
603
599
  #
604
600
  # See {connection.remove_reference}[rdoc-ref:SchemaStatements#remove_reference]
605
- def remove_references(*args)
606
- options = args.extract_options!
601
+ def remove_references(*args, **options)
607
602
  args.each do |ref_name|
608
603
  @base.remove_reference(name, ref_name, options)
609
604
  end
@@ -7,16 +7,15 @@ module ActiveRecord
7
7
  # Adapter level by over-writing this code inside the database specific adapters
8
8
  module ColumnDumper
9
9
  def column_spec(column)
10
- spec = Hash[prepare_column_options(column).map { |k, v| [k, "#{k}: #{v}"] }]
11
- spec[:name] = column.name.inspect
12
- spec[:type] = schema_type(column).to_s
13
- spec
10
+ [schema_type_with_virtual(column), prepare_column_options(column)]
14
11
  end
15
12
 
16
13
  def column_spec_for_primary_key(column)
17
14
  return {} if default_primary_key?(column)
18
15
  spec = { id: schema_type(column).inspect }
19
16
  spec.merge!(prepare_column_options(column).except!(:null))
17
+ spec[:default] ||= "nil" if explicit_primary_key_default?(column)
18
+ spec
20
19
  end
21
20
 
22
21
  # This can be overridden on an Adapter level basis to support other
@@ -38,9 +37,9 @@ module ActiveRecord
38
37
  end
39
38
 
40
39
  default = schema_default(column) if column.has_default?
41
- spec[:default] = default unless default.nil?
40
+ spec[:default] = default unless default.nil?
42
41
 
43
- spec[:null] = 'false' unless column.null
42
+ spec[:null] = "false" unless column.null
44
43
 
45
44
  if collation = schema_collation(column)
46
45
  spec[:collation] = collation
@@ -52,54 +51,67 @@ module ActiveRecord
52
51
  end
53
52
 
54
53
  # Lists the valid migration options
55
- def migration_keys
56
- [:name, :limit, :precision, :scale, :default, :null, :collation, :comment]
54
+ def migration_keys # :nodoc:
55
+ column_options_keys
57
56
  end
57
+ deprecate :migration_keys
58
58
 
59
59
  private
60
60
 
61
- def default_primary_key?(column)
62
- schema_type(column) == :integer
63
- end
61
+ def default_primary_key?(column)
62
+ schema_type(column) == :bigint
63
+ end
64
64
 
65
- def schema_type(column)
66
- if column.bigint?
67
- :bigint
68
- else
69
- column.type
65
+ def explicit_primary_key_default?(column)
66
+ false
70
67
  end
71
- end
72
68
 
73
- def schema_limit(column)
74
- limit = column.limit unless column.bigint?
75
- limit.inspect if limit && limit != native_database_types[column.type][:limit]
76
- end
69
+ def schema_type_with_virtual(column)
70
+ if supports_virtual_columns? && column.virtual?
71
+ :virtual
72
+ else
73
+ schema_type(column)
74
+ end
75
+ end
77
76
 
78
- def schema_precision(column)
79
- column.precision.inspect if column.precision
80
- end
77
+ def schema_type(column)
78
+ if column.bigint?
79
+ :bigint
80
+ else
81
+ column.type
82
+ end
83
+ end
81
84
 
82
- def schema_scale(column)
83
- column.scale.inspect if column.scale
84
- end
85
+ def schema_limit(column)
86
+ limit = column.limit unless column.bigint?
87
+ limit.inspect if limit && limit != native_database_types[column.type][:limit]
88
+ end
85
89
 
86
- def schema_default(column)
87
- type = lookup_cast_type_from_column(column)
88
- default = type.deserialize(column.default)
89
- if default.nil?
90
- schema_expression(column)
91
- else
92
- type.type_cast_for_schema(default)
90
+ def schema_precision(column)
91
+ column.precision.inspect if column.precision
93
92
  end
94
- end
95
93
 
96
- def schema_expression(column)
97
- "-> { #{column.default_function.inspect} }" if column.default_function
98
- end
94
+ def schema_scale(column)
95
+ column.scale.inspect if column.scale
96
+ end
99
97
 
100
- def schema_collation(column)
101
- column.collation.inspect if column.collation
102
- end
98
+ def schema_default(column)
99
+ type = lookup_cast_type_from_column(column)
100
+ default = type.deserialize(column.default)
101
+ if default.nil?
102
+ schema_expression(column)
103
+ else
104
+ type.type_cast_for_schema(default)
105
+ end
106
+ end
107
+
108
+ def schema_expression(column)
109
+ "-> { #{column.default_function.inspect} }" if column.default_function
110
+ end
111
+
112
+ def schema_collation(column)
113
+ column.collation.inspect if column.collation
114
+ end
103
115
  end
104
116
  end
105
117
  end