activerecord 4.2.0 → 4.2.11

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.

Files changed (110) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +657 -1
  3. data/lib/active_record.rb +3 -0
  4. data/lib/active_record/aggregations.rb +6 -3
  5. data/lib/active_record/association_relation.rb +13 -0
  6. data/lib/active_record/associations.rb +5 -4
  7. data/lib/active_record/associations/association.rb +15 -3
  8. data/lib/active_record/associations/association_scope.rb +1 -0
  9. data/lib/active_record/associations/belongs_to_association.rb +13 -5
  10. data/lib/active_record/associations/builder/association.rb +1 -1
  11. data/lib/active_record/associations/builder/collection_association.rb +5 -1
  12. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +8 -4
  13. data/lib/active_record/associations/collection_association.rb +35 -15
  14. data/lib/active_record/associations/collection_proxy.rb +15 -9
  15. data/lib/active_record/associations/foreign_association.rb +11 -0
  16. data/lib/active_record/associations/has_many_association.rb +30 -15
  17. data/lib/active_record/associations/has_many_through_association.rb +11 -2
  18. data/lib/active_record/associations/has_one_association.rb +1 -0
  19. data/lib/active_record/associations/join_dependency.rb +8 -2
  20. data/lib/active_record/associations/join_dependency/join_association.rb +7 -1
  21. data/lib/active_record/associations/preloader.rb +4 -4
  22. data/lib/active_record/associations/preloader/association.rb +5 -1
  23. data/lib/active_record/associations/singular_association.rb +2 -8
  24. data/lib/active_record/associations/through_association.rb +11 -6
  25. data/lib/active_record/attribute.rb +15 -1
  26. data/lib/active_record/attribute_assignment.rb +2 -2
  27. data/lib/active_record/attribute_methods.rb +4 -8
  28. data/lib/active_record/attribute_methods/before_type_cast.rb +5 -0
  29. data/lib/active_record/attribute_methods/dirty.rb +14 -4
  30. data/lib/active_record/attribute_methods/time_zone_conversion.rb +5 -1
  31. data/lib/active_record/attribute_methods/write.rb +1 -1
  32. data/lib/active_record/attribute_set.rb +4 -0
  33. data/lib/active_record/attribute_set/builder.rb +32 -12
  34. data/lib/active_record/attributes.rb +8 -0
  35. data/lib/active_record/autosave_association.rb +24 -9
  36. data/lib/active_record/base.rb +4 -5
  37. data/lib/active_record/callbacks.rb +1 -1
  38. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +12 -6
  39. data/lib/active_record/connection_adapters/abstract/database_statements.rb +23 -3
  40. data/lib/active_record/connection_adapters/abstract/query_cache.rb +1 -1
  41. data/lib/active_record/connection_adapters/abstract/quoting.rb +1 -0
  42. data/lib/active_record/connection_adapters/abstract/savepoints.rb +1 -1
  43. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +26 -16
  44. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +87 -24
  45. data/lib/active_record/connection_adapters/abstract/transaction.rb +2 -6
  46. data/lib/active_record/connection_adapters/abstract_adapter.rb +25 -7
  47. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +73 -10
  48. data/lib/active_record/connection_adapters/column.rb +2 -2
  49. data/lib/active_record/connection_adapters/mysql2_adapter.rb +7 -21
  50. data/lib/active_record/connection_adapters/mysql_adapter.rb +10 -3
  51. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +1 -1
  52. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +2 -1
  53. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +1 -0
  54. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +9 -0
  55. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +3 -1
  56. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +1 -1
  57. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -0
  58. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +17 -5
  59. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +3 -3
  60. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +21 -13
  61. data/lib/active_record/connection_adapters/postgresql_adapter.rb +12 -12
  62. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +12 -28
  63. data/lib/active_record/connection_handling.rb +1 -1
  64. data/lib/active_record/core.rb +28 -15
  65. data/lib/active_record/counter_cache.rb +1 -1
  66. data/lib/active_record/enum.rb +2 -3
  67. data/lib/active_record/errors.rb +6 -5
  68. data/lib/active_record/explain_subscriber.rb +1 -1
  69. data/lib/active_record/fixtures.rb +9 -7
  70. data/lib/active_record/gem_version.rb +1 -1
  71. data/lib/active_record/legacy_yaml_adapter.rb +30 -0
  72. data/lib/active_record/locking/optimistic.rb +16 -14
  73. data/lib/active_record/migration.rb +38 -10
  74. data/lib/active_record/model_schema.rb +4 -2
  75. data/lib/active_record/nested_attributes.rb +13 -3
  76. data/lib/active_record/no_touching.rb +1 -1
  77. data/lib/active_record/persistence.rb +7 -4
  78. data/lib/active_record/railtie.rb +5 -3
  79. data/lib/active_record/railties/databases.rake +17 -24
  80. data/lib/active_record/reflection.rb +40 -28
  81. data/lib/active_record/relation.rb +3 -2
  82. data/lib/active_record/relation/calculations.rb +10 -3
  83. data/lib/active_record/relation/delegation.rb +1 -1
  84. data/lib/active_record/relation/finder_methods.rb +4 -16
  85. data/lib/active_record/relation/merger.rb +24 -1
  86. data/lib/active_record/relation/predicate_builder.rb +32 -3
  87. data/lib/active_record/relation/predicate_builder/array_handler.rb +3 -2
  88. data/lib/active_record/relation/query_methods.rb +29 -27
  89. data/lib/active_record/relation/spawn_methods.rb +7 -3
  90. data/lib/active_record/schema_dumper.rb +1 -1
  91. data/lib/active_record/schema_migration.rb +1 -4
  92. data/lib/active_record/scoping/default.rb +1 -0
  93. data/lib/active_record/tasks/database_tasks.rb +5 -2
  94. data/lib/active_record/tasks/mysql_database_tasks.rb +30 -16
  95. data/lib/active_record/tasks/postgresql_database_tasks.rb +19 -8
  96. data/lib/active_record/transactions.rb +21 -11
  97. data/lib/active_record/type/boolean.rb +1 -0
  98. data/lib/active_record/type/date.rb +4 -0
  99. data/lib/active_record/type/date_time.rb +14 -3
  100. data/lib/active_record/type/decimal.rb +27 -3
  101. data/lib/active_record/type/hash_lookup_type_map.rb +8 -2
  102. data/lib/active_record/type/integer.rb +9 -5
  103. data/lib/active_record/type/numeric.rb +1 -1
  104. data/lib/active_record/type/serialized.rb +7 -1
  105. data/lib/active_record/type/string.rb +4 -0
  106. data/lib/active_record/type/value.rb +9 -0
  107. data/lib/active_record/validations/uniqueness.rb +16 -6
  108. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -3
  109. data/lib/rails/generators/active_record/migration/templates/migration.rb +0 -6
  110. metadata +9 -7
@@ -14,11 +14,17 @@ module ActiveRecord
14
14
  private
15
15
 
16
16
  def cast_value(value)
17
- case value
17
+ casted_value = case value
18
18
  when ::Float
19
- BigDecimal(value, float_precision)
20
- when ::Numeric, ::String
19
+ convert_float_to_big_decimal(value)
20
+ when ::Numeric
21
21
  BigDecimal(value, precision.to_i)
22
+ when ::String
23
+ begin
24
+ value.to_d
25
+ rescue ArgumentError
26
+ BigDecimal(0)
27
+ end
22
28
  else
23
29
  if value.respond_to?(:to_d)
24
30
  value.to_d
@@ -26,6 +32,16 @@ module ActiveRecord
26
32
  cast_value(value.to_s)
27
33
  end
28
34
  end
35
+
36
+ apply_scale(casted_value)
37
+ end
38
+
39
+ def convert_float_to_big_decimal(value)
40
+ if precision
41
+ BigDecimal(apply_scale(value), float_precision)
42
+ else
43
+ value.to_d
44
+ end
29
45
  end
30
46
 
31
47
  def float_precision
@@ -35,6 +51,14 @@ module ActiveRecord
35
51
  precision.to_i
36
52
  end
37
53
  end
54
+
55
+ def apply_scale(value)
56
+ if scale
57
+ value.round(scale)
58
+ else
59
+ value
60
+ end
61
+ end
38
62
  end
39
63
  end
40
64
  end
@@ -1,12 +1,18 @@
1
1
  module ActiveRecord
2
2
  module Type
3
3
  class HashLookupTypeMap < TypeMap # :nodoc:
4
- delegate :key?, to: :@mapping
5
-
6
4
  def alias_type(type, alias_type)
7
5
  register_type(type) { |_, *args| lookup(alias_type, *args) }
8
6
  end
9
7
 
8
+ def key?(key)
9
+ @mapping.key?(key)
10
+ end
11
+
12
+ def keys
13
+ @mapping.keys
14
+ end
15
+
10
16
  private
11
17
 
12
18
  def perform_fetch(type, *args, &block)
@@ -12,13 +12,19 @@ module ActiveRecord
12
12
  :integer
13
13
  end
14
14
 
15
- alias type_cast_for_database type_cast
16
-
17
15
  def type_cast_from_database(value)
18
16
  return if value.nil?
19
17
  value.to_i
20
18
  end
21
19
 
20
+ def type_cast_for_database(value)
21
+ result = type_cast(value)
22
+ if result
23
+ ensure_in_range(result)
24
+ end
25
+ result
26
+ end
27
+
22
28
  protected
23
29
 
24
30
  attr_reader :range
@@ -30,9 +36,7 @@ module ActiveRecord
30
36
  when true then 1
31
37
  when false then 0
32
38
  else
33
- result = value.to_i rescue nil
34
- ensure_in_range(result) if result
35
- result
39
+ value.to_i rescue nil
36
40
  end
37
41
  end
38
42
 
@@ -29,7 +29,7 @@ module ActiveRecord
29
29
  # 'wibble'.to_i will give zero, we want to make sure
30
30
  # that we aren't marking int zero to string zero as
31
31
  # changed.
32
- value.to_s !~ /\A\d+\.?\d*\z/
32
+ value.to_s !~ /\A-?\d+\.?\d*\z/
33
33
  end
34
34
  end
35
35
  end
@@ -27,9 +27,15 @@ module ActiveRecord
27
27
  end
28
28
  end
29
29
 
30
+ def inspect
31
+ Kernel.instance_method(:inspect).bind(self).call
32
+ end
33
+
30
34
  def changed_in_place?(raw_old_value, value)
31
35
  return false if value.nil?
32
- subtype.changed_in_place?(raw_old_value, coder.dump(value))
36
+ raw_new_value = type_cast_for_database(value)
37
+ raw_old_value.nil? != raw_new_value.nil? ||
38
+ subtype.changed_in_place?(raw_old_value, raw_new_value)
33
39
  end
34
40
 
35
41
  def accessor
@@ -21,6 +21,10 @@ module ActiveRecord
21
21
  end
22
22
  end
23
23
 
24
+ def text?
25
+ true
26
+ end
27
+
24
28
  private
25
29
 
26
30
  def cast_value(value)
@@ -50,6 +50,10 @@ module ActiveRecord
50
50
 
51
51
  # These predicates are not documented, as I need to look further into
52
52
  # their use, and see if they can be removed entirely.
53
+ def text? # :nodoc:
54
+ false
55
+ end
56
+
53
57
  def number? # :nodoc:
54
58
  false
55
59
  end
@@ -82,6 +86,11 @@ module ActiveRecord
82
86
  scale == other.scale &&
83
87
  limit == other.limit
84
88
  end
89
+ alias eql? ==
90
+
91
+ def hash
92
+ [self.class, precision, scale, limit].hash
93
+ end
85
94
 
86
95
  private
87
96
 
@@ -15,11 +15,21 @@ module ActiveRecord
15
15
  table = finder_class.arel_table
16
16
  value = map_enum_attribute(finder_class, attribute, value)
17
17
 
18
- relation = build_relation(finder_class, table, attribute, value)
19
- relation = relation.and(table[finder_class.primary_key.to_sym].not_eq(record.id)) if record.persisted?
20
- relation = scope_relation(record, table, relation)
21
- relation = finder_class.unscoped.where(relation)
22
- relation = relation.merge(options[:conditions]) if options[:conditions]
18
+ begin
19
+ relation = build_relation(finder_class, table, attribute, value)
20
+ if record.persisted?
21
+ if finder_class.primary_key
22
+ relation = relation.and(table[finder_class.primary_key.to_sym].not_eq(record.id))
23
+ else
24
+ raise UnknownPrimaryKey.new(finder_class, "Can not validate uniqueness for persisted record without primary key.")
25
+ end
26
+ end
27
+ relation = scope_relation(record, table, relation)
28
+ relation = finder_class.unscoped.where(relation)
29
+ relation = relation.merge(options[:conditions]) if options[:conditions]
30
+ rescue RangeError
31
+ relation = finder_class.none
32
+ end
23
33
 
24
34
  if relation.exists?
25
35
  error_options = options.except(:case_sensitive, :scope, :conditions)
@@ -65,7 +75,7 @@ module ActiveRecord
65
75
  value = value.to_s[0, column.limit]
66
76
  end
67
77
 
68
- if !options[:case_sensitive] && value.is_a?(String)
78
+ if !options[:case_sensitive] && value && column.text?
69
79
  # will use SQL LOWER function before comparison, unless it detects a case insensitive collation
70
80
  klass.connection.case_insensitive_comparison(table, attribute, column, value)
71
81
  else
@@ -14,9 +14,6 @@ class <%= migration_class_name %> < ActiveRecord::Migration
14
14
  end
15
15
  <% attributes_with_index.each do |attribute| -%>
16
16
  add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
17
- <% end -%>
18
- <% attributes.select(&:reference?).reject(&:polymorphic?).each do |attribute| -%>
19
- add_foreign_key :<%= table_name %>, :<%= attribute.name.pluralize %>
20
17
  <% end -%>
21
18
  end
22
19
  end
@@ -4,9 +4,6 @@ class <%= migration_class_name %> < ActiveRecord::Migration
4
4
  <% attributes.each do |attribute| -%>
5
5
  <%- if attribute.reference? -%>
6
6
  add_reference :<%= table_name %>, :<%= attribute.name %><%= attribute.inject_options %>
7
- <%- unless attribute.polymorphic? -%>
8
- add_foreign_key :<%= table_name %>, :<%= attribute.name.pluralize %>
9
- <%- end -%>
10
7
  <%- else -%>
11
8
  add_column :<%= table_name %>, :<%= attribute.name %>, :<%= attribute.type %><%= attribute.inject_options %>
12
9
  <%- if attribute.has_index? -%>
@@ -29,9 +26,6 @@ class <%= migration_class_name %> < ActiveRecord::Migration
29
26
  <%- if migration_action -%>
30
27
  <%- if attribute.reference? -%>
31
28
  remove_reference :<%= table_name %>, :<%= attribute.name %><%= attribute.inject_options %>
32
- <%- unless attribute.polymorphic? -%>
33
- remove_foreign_key :<%= table_name %>, :<%= attribute.name.pluralize %>
34
- <%- end -%>
35
29
  <%- else -%>
36
30
  <%- if attribute.has_index? -%>
37
31
  remove_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
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: 4.2.0
4
+ version: 4.2.11
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: 2014-12-20 00:00:00.000000000 Z
11
+ date: 2018-11-27 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: 4.2.0
19
+ version: 4.2.11
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: 4.2.0
26
+ version: 4.2.11
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: 4.2.0
33
+ version: 4.2.11
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: 4.2.0
40
+ version: 4.2.11
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: arel
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -84,6 +84,7 @@ files:
84
84
  - lib/active_record/associations/builder/singular_association.rb
85
85
  - lib/active_record/associations/collection_association.rb
86
86
  - lib/active_record/associations/collection_proxy.rb
87
+ - lib/active_record/associations/foreign_association.rb
87
88
  - lib/active_record/associations/has_many_association.rb
88
89
  - lib/active_record/associations/has_many_through_association.rb
89
90
  - lib/active_record/associations/has_one_association.rb
@@ -193,6 +194,7 @@ files:
193
194
  - lib/active_record/gem_version.rb
194
195
  - lib/active_record/inheritance.rb
195
196
  - lib/active_record/integration.rb
197
+ - lib/active_record/legacy_yaml_adapter.rb
196
198
  - lib/active_record/locale/en.yml
197
199
  - lib/active_record/locking/optimistic.rb
198
200
  - lib/active_record/locking/pessimistic.rb
@@ -302,7 +304,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
302
304
  version: '0'
303
305
  requirements: []
304
306
  rubyforge_project:
305
- rubygems_version: 2.2.2
307
+ rubygems_version: 2.7.6
306
308
  signing_key:
307
309
  specification_version: 4
308
310
  summary: Object-relational mapper framework (part of Rails).