massive_record 0.2.1 → 0.2.2.rc1

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.
Files changed (135) hide show
  1. data/CHANGELOG.md +58 -2
  2. data/Gemfile.lock +17 -17
  3. data/README.md +98 -41
  4. data/lib/massive_record.rb +2 -1
  5. data/lib/massive_record/adapters/thrift/hbase/hbase.rb +2425 -2154
  6. data/lib/massive_record/adapters/thrift/hbase/hbase_constants.rb +3 -3
  7. data/lib/massive_record/adapters/thrift/hbase/hbase_types.rb +195 -195
  8. data/lib/massive_record/adapters/thrift/row.rb +35 -4
  9. data/lib/massive_record/adapters/thrift/table.rb +49 -12
  10. data/lib/massive_record/orm/attribute_methods.rb +77 -5
  11. data/lib/massive_record/orm/attribute_methods/cast_numbers_on_write.rb +24 -0
  12. data/lib/massive_record/orm/attribute_methods/dirty.rb +18 -0
  13. data/lib/massive_record/orm/attribute_methods/time_zone_conversion.rb +24 -3
  14. data/lib/massive_record/orm/attribute_methods/write.rb +8 -1
  15. data/lib/massive_record/orm/base.rb +62 -8
  16. data/lib/massive_record/orm/column.rb +7 -11
  17. data/lib/massive_record/orm/default_id.rb +1 -1
  18. data/lib/massive_record/orm/embedded.rb +66 -0
  19. data/lib/massive_record/orm/errors.rb +17 -0
  20. data/lib/massive_record/orm/finders.rb +124 -71
  21. data/lib/massive_record/orm/finders/rescue_missing_table_on_find.rb +1 -1
  22. data/lib/massive_record/orm/finders/scope.rb +58 -34
  23. data/lib/massive_record/orm/id_factory.rb +22 -105
  24. data/lib/massive_record/orm/id_factory/atomic_incrementation.rb +117 -0
  25. data/lib/massive_record/orm/id_factory/timestamp.rb +60 -0
  26. data/lib/massive_record/orm/identity_map.rb +256 -0
  27. data/lib/massive_record/orm/log_subscriber.rb +18 -0
  28. data/lib/massive_record/orm/observer.rb +69 -0
  29. data/lib/massive_record/orm/persistence.rb +47 -119
  30. data/lib/massive_record/orm/persistence/operations.rb +100 -0
  31. data/lib/massive_record/orm/persistence/operations/atomic_operation.rb +71 -0
  32. data/lib/massive_record/orm/persistence/operations/destroy.rb +17 -0
  33. data/lib/massive_record/orm/persistence/operations/embedded/destroy.rb +26 -0
  34. data/lib/massive_record/orm/persistence/operations/embedded/insert.rb +27 -0
  35. data/lib/massive_record/orm/persistence/operations/embedded/operation_helpers.rb +66 -0
  36. data/lib/massive_record/orm/persistence/operations/embedded/reload.rb +39 -0
  37. data/lib/massive_record/orm/persistence/operations/embedded/update.rb +29 -0
  38. data/lib/massive_record/orm/persistence/operations/insert.rb +19 -0
  39. data/lib/massive_record/orm/persistence/operations/reload.rb +26 -0
  40. data/lib/massive_record/orm/persistence/operations/suppress.rb +15 -0
  41. data/lib/massive_record/orm/persistence/operations/table_operation_helpers.rb +106 -0
  42. data/lib/massive_record/orm/persistence/operations/update.rb +25 -0
  43. data/lib/massive_record/orm/query_instrumentation.rb +26 -49
  44. data/lib/massive_record/orm/raw_data.rb +47 -0
  45. data/lib/massive_record/orm/relations.rb +4 -0
  46. data/lib/massive_record/orm/relations/interface.rb +134 -0
  47. data/lib/massive_record/orm/relations/metadata.rb +58 -12
  48. data/lib/massive_record/orm/relations/proxy.rb +17 -12
  49. data/lib/massive_record/orm/relations/proxy/embedded_in.rb +54 -0
  50. data/lib/massive_record/orm/relations/proxy/embedded_in_polymorphic.rb +15 -0
  51. data/lib/massive_record/orm/relations/proxy/embeds_many.rb +215 -0
  52. data/lib/massive_record/orm/relations/proxy/references_many.rb +112 -88
  53. data/lib/massive_record/orm/relations/proxy/references_one.rb +1 -1
  54. data/lib/massive_record/orm/relations/proxy/references_one_polymorphic.rb +1 -1
  55. data/lib/massive_record/orm/relations/proxy_collection.rb +84 -0
  56. data/lib/massive_record/orm/schema/column_family.rb +3 -2
  57. data/lib/massive_record/orm/schema/{column_interface.rb → embedded_interface.rb} +38 -4
  58. data/lib/massive_record/orm/schema/field.rb +2 -0
  59. data/lib/massive_record/orm/schema/table_interface.rb +19 -2
  60. data/lib/massive_record/orm/single_table_inheritance.rb +37 -2
  61. data/lib/massive_record/orm/timestamps.rb +17 -7
  62. data/lib/massive_record/orm/validations.rb +4 -0
  63. data/lib/massive_record/orm/validations/associated.rb +50 -0
  64. data/lib/massive_record/rails/railtie.rb +31 -0
  65. data/lib/massive_record/version.rb +1 -1
  66. data/lib/massive_record/wrapper/cell.rb +8 -1
  67. data/massive_record.gemspec +4 -4
  68. data/spec/adapter/thrift/atomic_increment_spec.rb +16 -0
  69. data/spec/adapter/thrift/table_find_spec.rb +14 -2
  70. data/spec/adapter/thrift/table_spec.rb +6 -6
  71. data/spec/adapter/thrift/utf8_encoding_of_id_spec.rb +71 -0
  72. data/spec/orm/cases/attribute_methods_spec.rb +215 -22
  73. data/spec/orm/cases/auto_generate_id_spec.rb +1 -1
  74. data/spec/orm/cases/change_id_spec.rb +62 -0
  75. data/spec/orm/cases/default_id_spec.rb +25 -6
  76. data/spec/orm/cases/default_values_spec.rb +6 -3
  77. data/spec/orm/cases/dirty_spec.rb +150 -102
  78. data/spec/orm/cases/embedded_spec.rb +250 -0
  79. data/spec/orm/cases/{finder_default_scope.rb → finder_default_scope_spec.rb} +4 -0
  80. data/spec/orm/cases/finder_scope_spec.rb +96 -29
  81. data/spec/orm/cases/finders_spec.rb +57 -10
  82. data/spec/orm/cases/id_factory/atomic_incrementation_spec.rb +72 -0
  83. data/spec/orm/cases/id_factory/timestamp_spec.rb +61 -0
  84. data/spec/orm/cases/identity_map/identity_map_spec.rb +357 -0
  85. data/spec/orm/cases/identity_map/middleware_spec.rb +74 -0
  86. data/spec/orm/cases/log_subscriber_spec.rb +15 -2
  87. data/spec/orm/cases/observing_spec.rb +61 -0
  88. data/spec/orm/cases/persistence_spec.rb +151 -60
  89. data/spec/orm/cases/raw_data_spec.rb +58 -0
  90. data/spec/orm/cases/single_table_inheritance_spec.rb +58 -2
  91. data/spec/orm/cases/table_spec.rb +3 -3
  92. data/spec/orm/cases/time_zone_awareness_spec.rb +27 -0
  93. data/spec/orm/cases/timestamps_spec.rb +23 -109
  94. data/spec/orm/cases/validation_spec.rb +9 -0
  95. data/spec/orm/models/address.rb +5 -1
  96. data/spec/orm/models/address_with_timestamp.rb +12 -0
  97. data/spec/orm/models/car.rb +5 -0
  98. data/spec/orm/models/person.rb +13 -1
  99. data/spec/orm/models/person_with_timestamp.rb +4 -2
  100. data/spec/orm/models/test_class.rb +1 -0
  101. data/spec/orm/persistence/operations/atomic_operation_spec.rb +58 -0
  102. data/spec/orm/persistence/operations/destroy_spec.rb +22 -0
  103. data/spec/orm/persistence/operations/embedded/destroy_spec.rb +71 -0
  104. data/spec/orm/persistence/operations/embedded/insert_spec.rb +59 -0
  105. data/spec/orm/persistence/operations/embedded/operation_helpers_spec.rb +92 -0
  106. data/spec/orm/persistence/operations/embedded/reload_spec.rb +67 -0
  107. data/spec/orm/persistence/operations/embedded/update_spec.rb +60 -0
  108. data/spec/orm/persistence/operations/insert_spec.rb +31 -0
  109. data/spec/orm/persistence/operations/reload_spec.rb +48 -0
  110. data/spec/orm/persistence/operations/suppress_spec.rb +17 -0
  111. data/spec/orm/persistence/operations/table_operation_helpers_spec.rb +98 -0
  112. data/spec/orm/persistence/operations/update_spec.rb +25 -0
  113. data/spec/orm/persistence/operations_spec.rb +58 -0
  114. data/spec/orm/relations/interface_spec.rb +188 -0
  115. data/spec/orm/relations/metadata_spec.rb +92 -15
  116. data/spec/orm/relations/proxy/embedded_in_polymorphic_spec.rb +37 -0
  117. data/spec/orm/relations/proxy/embedded_in_spec.rb +66 -0
  118. data/spec/orm/relations/proxy/embeds_many_spec.rb +651 -0
  119. data/spec/orm/relations/proxy/references_many_spec.rb +466 -2
  120. data/spec/orm/schema/column_family_spec.rb +21 -0
  121. data/spec/orm/schema/embedded_interface_spec.rb +181 -0
  122. data/spec/orm/schema/field_spec.rb +7 -0
  123. data/spec/orm/schema/table_interface_spec.rb +31 -1
  124. data/spec/shared/orm/id_factories.rb +44 -0
  125. data/spec/shared/orm/model_with_timestamps.rb +132 -0
  126. data/spec/shared/orm/persistence/a_persistence_embedded_operation_class.rb +3 -0
  127. data/spec/shared/orm/persistence/a_persistence_operation_class.rb +11 -0
  128. data/spec/shared/orm/persistence/a_persistence_table_operation_class.rb +11 -0
  129. data/spec/shared/orm/relations/proxy.rb +9 -2
  130. data/spec/spec_helper.rb +9 -0
  131. data/spec/support/mock_massive_record_connection.rb +2 -1
  132. metadata +106 -21
  133. data/spec/orm/cases/column_spec.rb +0 -49
  134. data/spec/orm/cases/id_factory_spec.rb +0 -92
  135. data/spec/orm/schema/column_interface_spec.rb +0 -136
@@ -0,0 +1,17 @@
1
+ require 'massive_record/orm/persistence/operations/table_operation_helpers'
2
+
3
+ module MassiveRecord
4
+ module ORM
5
+ module Persistence
6
+ module Operations
7
+ class Destroy
8
+ include Operations, TableOperationHelpers
9
+
10
+ def execute
11
+ row_for_record.destroy
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ require 'massive_record/orm/persistence/operations/embedded/operation_helpers'
2
+
3
+ module MassiveRecord
4
+ module ORM
5
+ module Persistence
6
+ module Operations
7
+ module Embedded
8
+ class Destroy
9
+ include Operations, OperationHelpers
10
+
11
+ def execute
12
+ embedded_in_proxies.each do |proxy|
13
+ if proxy.load_proxy_target && proxy.load_proxy_target.persisted?
14
+ inverse_proxy_for(proxy).delete(record)
15
+ update_embedded(proxy, nil)
16
+ end
17
+ end
18
+
19
+ true
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ require 'massive_record/orm/persistence/operations/embedded/operation_helpers'
2
+
3
+ module MassiveRecord
4
+ module ORM
5
+ module Persistence
6
+ module Operations
7
+ module Embedded
8
+ class Insert
9
+ include Operations, OperationHelpers
10
+
11
+ def execute
12
+ raise_error_if_embedded_in_proxy_targets_are_missing
13
+
14
+ # NOTE
15
+ #
16
+ # When / if we allow for auto-save false when assigning
17
+ # an embedded record to an embeds many collection we might
18
+ # want to only update current insert in the targets, not a
19
+ # complete save of the parent.
20
+ embedded_in_proxy_targets.collect(&:save).any?
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,66 @@
1
+ module MassiveRecord
2
+ module ORM
3
+ module Persistence
4
+ module Operations
5
+ module Embedded
6
+ module OperationHelpers
7
+ def embedded_in_proxies
8
+ record.relation_proxies.select { |proxy| proxy.metadata.embedded_in? }
9
+ end
10
+
11
+ def embedded_in_proxy_targets
12
+ embedded_in_proxies.collect(&:load_proxy_target).compact
13
+ end
14
+
15
+ def raise_error_if_embedded_in_proxy_targets_are_missing
16
+ relations_not_assigned = []
17
+ relations_assigned = []
18
+
19
+ embedded_in_proxies.each do |proxy|
20
+ if proxy.load_proxy_target.nil?
21
+ relations_not_assigned << proxy.metadata.name
22
+ else
23
+ relations_assigned << proxy.metadata.name
24
+ end
25
+ end
26
+
27
+ if relations_assigned.empty?
28
+ raise MassiveRecord::ORM::NotAssignedToEmbeddedCollection.new(record, relations_not_assigned)
29
+ end
30
+ end
31
+
32
+ def update_embedded(relation_proxy, value)
33
+ row = row_for_record(relation_proxy)
34
+ row.values = {
35
+ inverse_proxy_for(relation_proxy).metadata.store_in => {
36
+ record.database_id => value
37
+ }
38
+ }
39
+ row.save
40
+ end
41
+
42
+
43
+
44
+
45
+
46
+
47
+ def inverse_proxy_for(proxy)
48
+ proxy.load_proxy_target.send(:relation_proxy, proxy.metadata.inverse_of)
49
+ end
50
+
51
+
52
+ def row_for_record(record)
53
+ raise IdMissing.new("You must set an ID before save.") if record.id.blank?
54
+
55
+ MassiveRecord::Wrapper::Row.new({
56
+ :id => record.id,
57
+ :table => record.class.table
58
+ })
59
+ end
60
+
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,39 @@
1
+ require 'massive_record/orm/persistence/operations/embedded/operation_helpers'
2
+
3
+ module MassiveRecord
4
+ module ORM
5
+ module Persistence
6
+ module Operations
7
+ module Embedded
8
+ class Reload
9
+ include Operations, OperationHelpers
10
+
11
+ class UnsupportedNumberOfEmbeddedIn < MassiveRecordError; end
12
+
13
+ def execute
14
+ if record.persisted? && embeds_many_proxy_to_reload_from
15
+ embeds_many_proxy_to_reload_from = inverse_proxy_for(embedded_in_proxies.first)
16
+ embeds_many_proxy_to_reload_from.reload
17
+ embeds_many_proxy_to_reload_from.find(record.id).tap do |reloaded_record|
18
+ record.reinit_with({
19
+ 'attributes' => reloaded_record.attributes,
20
+ 'raw_data' => reloaded_record.raw_data
21
+ })
22
+ end
23
+
24
+ true
25
+ end
26
+ end
27
+
28
+
29
+ private
30
+
31
+ def embeds_many_proxy_to_reload_from
32
+ @embeds_many_proxy_to_reload_from ||= embedded_in_proxies.select { |p| p.load_proxy_target.present? }.first
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,29 @@
1
+ require 'massive_record/orm/persistence/operations/embedded/operation_helpers'
2
+
3
+ module MassiveRecord
4
+ module ORM
5
+ module Persistence
6
+ module Operations
7
+ module Embedded
8
+ class Update
9
+ include Operations, OperationHelpers
10
+
11
+ def execute
12
+ raise_error_if_embedded_in_proxy_targets_are_missing
13
+ update_only_embedded_record_in_owners
14
+ end
15
+
16
+
17
+ private
18
+
19
+ def update_only_embedded_record_in_owners
20
+ embedded_in_proxies.select { |p| p.load_proxy_target.present? }.each do |proxy|
21
+ update_embedded(proxy, Base.coder.dump(record.attributes_db_raw_data_hash))
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ require 'massive_record/orm/persistence/operations/table_operation_helpers'
2
+
3
+ module MassiveRecord
4
+ module ORM
5
+ module Persistence
6
+ module Operations
7
+ class Insert
8
+ include Operations, TableOperationHelpers
9
+
10
+ def execute
11
+ ensure_that_we_have_table_and_column_families!
12
+ raise RecordNotUnique if klass.check_record_uniqueness_on_create && klass.exists?(record.id)
13
+ store_record_to_database('create')
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,26 @@
1
+ require 'massive_record/orm/persistence/operations/table_operation_helpers'
2
+
3
+ module MassiveRecord
4
+ module ORM
5
+ module Persistence
6
+ module Operations
7
+ class Reload
8
+ include Operations, TableOperationHelpers
9
+
10
+ def execute
11
+ if record.persisted?
12
+ klass.find(record.id).tap do |reloaded_record|
13
+ record.reinit_with({
14
+ 'attributes' => reloaded_record.attributes,
15
+ 'raw_data' => reloaded_record.raw_data
16
+ })
17
+ end
18
+
19
+ true
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ module MassiveRecord
2
+ module ORM
3
+ module Persistence
4
+ module Operations
5
+ class Suppress
6
+ include Operations
7
+
8
+ def execute
9
+ true
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,106 @@
1
+ require 'massive_record/orm/query_instrumentation'
2
+
3
+ module MassiveRecord
4
+ module ORM
5
+ module Persistence
6
+ module Operations
7
+ module TableOperationHelpers
8
+
9
+ def self.included(base)
10
+ base.class_eval do
11
+ include MassiveRecord::ORM::QueryInstrumentation::Operations
12
+ end
13
+ end
14
+
15
+
16
+ #
17
+ # Calculate which column families are missing in the database in
18
+ # context of what the schema instructs.
19
+ #
20
+ def self.calculate_missing_family_names(klass)
21
+ existing_family_names = klass.table.fetch_column_families.collect(&:name) rescue []
22
+ expected_family_names = klass.column_families ? klass.column_families.collect(&:name) : []
23
+
24
+ expected_family_names.collect(&:to_s) - existing_family_names.collect(&:to_s)
25
+ end
26
+
27
+ #
28
+ # Creates table for ORM classes
29
+ #
30
+ def self.hbase_create_table!(klass)
31
+ missing_family_names = calculate_missing_family_names(klass)
32
+ klass.table.create_column_families(missing_family_names) unless missing_family_names.empty?
33
+ klass.table.save
34
+ end
35
+
36
+ #
37
+ # Iterates over tables and column families and ensure that we
38
+ # have what we need
39
+ #
40
+ def ensure_that_we_have_table_and_column_families! # :nodoc:
41
+ #
42
+ # TODO: Can we skip checking if it exists at all, and instead, rescue it if it does not?
43
+ #
44
+ hbase_create_table! unless klass.table.exists?
45
+ raise ColumnFamiliesMissingError.new(klass, calculate_missing_family_names) if calculate_missing_family_names.any?
46
+ end
47
+
48
+ def hbase_create_table!
49
+ TableOperationHelpers.hbase_create_table!(klass)
50
+ end
51
+
52
+
53
+ def calculate_missing_family_names
54
+ TableOperationHelpers.calculate_missing_family_names(klass)
55
+ end
56
+
57
+
58
+
59
+
60
+
61
+ #
62
+ # Returns a Wrapper::Row class which we can manipulate this
63
+ # record in the database with
64
+ #
65
+ def row_for_record
66
+ raise IdMissing.new("You must set an ID before save.") if record.id.blank?
67
+
68
+ MassiveRecord::Wrapper::Row.new({
69
+ :id => record.id,
70
+ :table => klass.table
71
+ })
72
+ end
73
+
74
+ #
75
+ # Returns attributes on a form which Wrapper::Row expects
76
+ #
77
+ def attributes_to_row_values_hash(only_attr_names = [])
78
+ values = Hash.new { |hash, key| hash[key] = Hash.new }
79
+
80
+ record.attributes_schema.each do |attr_name, orm_field|
81
+ next unless only_attr_names.empty? || only_attr_names.include?(attr_name)
82
+ values[orm_field.column_family.name][orm_field.column] = orm_field.encode(record[attr_name])
83
+ end
84
+
85
+ record.relation_proxies_for_embedded.select { |p| p.proxy_targets_update_hash.any? }.each do |proxy_with_changes|
86
+ values[proxy_with_changes.metadata.store_in].merge!(proxy_with_changes.proxy_targets_update_hash)
87
+ end
88
+
89
+ values
90
+ end
91
+
92
+
93
+ #
94
+ # Takes care of the actual storing of the record to the database
95
+ # Both update and create is using this
96
+ #
97
+ def store_record_to_database(action, attribute_names_to_update = [])
98
+ row = row_for_record
99
+ row.values = attributes_to_row_values_hash(attribute_names_to_update)
100
+ row.save
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,25 @@
1
+ require 'massive_record/orm/persistence/operations/table_operation_helpers'
2
+
3
+ module MassiveRecord
4
+ module ORM
5
+ module Persistence
6
+ module Operations
7
+ class Update
8
+ include Operations, TableOperationHelpers
9
+
10
+ def execute
11
+ ensure_that_we_have_table_and_column_families!
12
+ store_record_to_database('update', attribute_names_to_update)
13
+ end
14
+
15
+
16
+ private
17
+
18
+ def attribute_names_to_update
19
+ options[:attribute_names_to_update] || []
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,64 +1,41 @@
1
1
  module MassiveRecord
2
2
  module ORM
3
3
  module QueryInstrumentation
4
- extend ActiveSupport::Concern
5
-
6
- module ClassMethods
7
- #
8
- # do_find is the method which *all* find operations goes
9
- # through. For instrumentation on the query only see
10
- # hbase_query_all_first /hbase_query_find
11
- #
12
- def do_find(*args)
13
- ActiveSupport::Notifications.instrument("load.massive_record", {
14
- :name => [model_name, 'load'].join(' '),
15
- :description => "",
16
- :options => args
17
- }) do
18
- super
4
+ module Table
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ %w(find_one find_some find_all).each do |method_to_instrument|
9
+ module_eval <<-RUBY, __FILE__, __LINE__
10
+
11
+ def #{method_to_instrument}(*args)
12
+ ActiveSupport::Notifications.instrument("load.massive_record", {
13
+ :name => [model_name, 'load'].join(' '),
14
+ :description => "#{method_to_instrument}",
15
+ :options => args
16
+ }) do
17
+ super
18
+ end
19
+ end
20
+
21
+ RUBY
19
22
  end
20
23
  end
24
+ end
21
25
 
26
+ module Operations
27
+ def store_record_to_database(action, attribute_names_to_update = [])
28
+ description = action + " id: #{record.id},"
29
+ description += " attributes: #{attribute_names_to_update.join(', ')}" if attribute_names_to_update.any?
22
30
 
23
-
24
-
25
- private
26
-
27
- def hbase_query_all_first(type, *args)
28
- ActiveSupport::Notifications.instrument("find_query.massive_record", {
29
- :name => [model_name, 'query'].join(' '),
30
- :description => type,
31
- :options => args
32
- }) do
33
- super
34
- end
35
- end
36
-
37
- def hbase_query_find(what_to_find, options)
38
- ActiveSupport::Notifications.instrument("find_query.massive_record", {
39
- :name => [model_name, 'query'].join(' '),
40
- :description => "find id(s): #{what_to_find}",
41
- :options => options
31
+ ActiveSupport::Notifications.instrument("query.massive_record", {
32
+ :name => [klass.model_name, 'save'].join(' '),
33
+ :description => description
42
34
  }) do
43
35
  super
44
36
  end
45
37
  end
46
38
  end
47
-
48
-
49
- private
50
-
51
- def store_record_to_database(action, attribute_names_to_update = [])
52
- description = action + " id: #{id},"
53
- description += " attributes: #{attribute_names_to_update.join(', ')}" if attribute_names_to_update.any?
54
-
55
- ActiveSupport::Notifications.instrument("query.massive_record", {
56
- :name => [self.class.model_name, 'save'].join(' '),
57
- :description => description
58
- }) do
59
- super
60
- end
61
- end
62
39
  end
63
40
  end
64
41
  end