datastax_rails 2.0.12 → 2.0.15

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +5 -5
  3. data/lib/blankslate.rb +8 -11
  4. data/lib/cql-rb_extensions.rb +5 -3
  5. data/lib/datastax_rails/associations/association.rb +93 -101
  6. data/lib/datastax_rails/associations/association_scope.rb +7 -7
  7. data/lib/datastax_rails/associations/belongs_to_association.rb +46 -48
  8. data/lib/datastax_rails/associations/builder/association.rb +32 -31
  9. data/lib/datastax_rails/associations/builder/belongs_to.rb +19 -20
  10. data/lib/datastax_rails/associations/builder/collection_association.rb +32 -32
  11. data/lib/datastax_rails/associations/builder/has_and_belongs_to_many.rb +21 -21
  12. data/lib/datastax_rails/associations/builder/has_many.rb +39 -40
  13. data/lib/datastax_rails/associations/builder/has_one.rb +30 -31
  14. data/lib/datastax_rails/associations/builder/singular_association.rb +31 -33
  15. data/lib/datastax_rails/associations/collection_association.rb +129 -135
  16. data/lib/datastax_rails/associations/collection_proxy.rb +21 -21
  17. data/lib/datastax_rails/associations/has_and_belongs_to_many_association.rb +26 -26
  18. data/lib/datastax_rails/associations/has_many_association.rb +38 -38
  19. data/lib/datastax_rails/associations/has_one_association.rb +31 -32
  20. data/lib/datastax_rails/associations/singular_association.rb +31 -30
  21. data/lib/datastax_rails/associations.rb +27 -24
  22. data/lib/datastax_rails/attribute_assignment.rb +17 -17
  23. data/lib/datastax_rails/attribute_methods/definition.rb +4 -4
  24. data/lib/datastax_rails/attribute_methods/dirty.rb +34 -33
  25. data/lib/datastax_rails/attribute_methods/primary_key.rb +3 -8
  26. data/lib/datastax_rails/attribute_methods/read.rb +10 -12
  27. data/lib/datastax_rails/attribute_methods/typecasting.rb +36 -35
  28. data/lib/datastax_rails/attribute_methods/write.rb +5 -6
  29. data/lib/datastax_rails/attribute_methods.rb +52 -56
  30. data/lib/datastax_rails/base.rb +122 -125
  31. data/lib/datastax_rails/callbacks.rb +15 -9
  32. data/lib/datastax_rails/cassandra_only_model.rb +6 -6
  33. data/lib/datastax_rails/collection.rb +5 -7
  34. data/lib/datastax_rails/column.rb +130 -118
  35. data/lib/datastax_rails/connection/statement_cache.rb +3 -3
  36. data/lib/datastax_rails/connection.rb +42 -33
  37. data/lib/datastax_rails/cql/alter_column_family.rb +19 -21
  38. data/lib/datastax_rails/cql/base.rb +8 -11
  39. data/lib/datastax_rails/cql/column_family.rb +11 -10
  40. data/lib/datastax_rails/cql/consistency.rb +2 -2
  41. data/lib/datastax_rails/cql/create_column_family.rb +15 -15
  42. data/lib/datastax_rails/cql/create_index.rb +5 -5
  43. data/lib/datastax_rails/cql/create_keyspace.rb +7 -7
  44. data/lib/datastax_rails/cql/delete.rb +16 -29
  45. data/lib/datastax_rails/cql/drop_column_family.rb +2 -2
  46. data/lib/datastax_rails/cql/drop_index.rb +2 -2
  47. data/lib/datastax_rails/cql/drop_keyspace.rb +2 -2
  48. data/lib/datastax_rails/cql/insert.rb +10 -16
  49. data/lib/datastax_rails/cql/select.rb +21 -33
  50. data/lib/datastax_rails/cql/truncate.rb +2 -2
  51. data/lib/datastax_rails/cql/update.rb +16 -24
  52. data/lib/datastax_rails/cql/use_keyspace.rb +2 -2
  53. data/lib/datastax_rails/cql.rb +2 -2
  54. data/lib/datastax_rails/dynamic_model.rb +32 -29
  55. data/lib/datastax_rails/errors.rb +6 -6
  56. data/lib/datastax_rails/grouped_collection.rb +3 -3
  57. data/lib/datastax_rails/inheritance.rb +9 -9
  58. data/lib/datastax_rails/payload_model.rb +24 -20
  59. data/lib/datastax_rails/persistence.rb +116 -110
  60. data/lib/datastax_rails/railtie.rb +7 -7
  61. data/lib/datastax_rails/reflection.rb +61 -59
  62. data/lib/datastax_rails/relation/batches.rb +12 -13
  63. data/lib/datastax_rails/relation/facet_methods.rb +44 -33
  64. data/lib/datastax_rails/relation/finder_methods.rb +95 -91
  65. data/lib/datastax_rails/relation/modification_methods.rb +5 -5
  66. data/lib/datastax_rails/relation/search_methods.rb +102 -102
  67. data/lib/datastax_rails/relation/spawn_methods.rb +25 -24
  68. data/lib/datastax_rails/relation/stats_methods.rb +9 -8
  69. data/lib/datastax_rails/relation.rb +165 -170
  70. data/lib/datastax_rails/rsolr_client_wrapper.rb +3 -3
  71. data/lib/datastax_rails/schema/cassandra.rb +44 -43
  72. data/lib/datastax_rails/schema/migrator.rb +52 -52
  73. data/lib/datastax_rails/schema/solr.rb +55 -47
  74. data/lib/datastax_rails/schema_cache.rb +1 -3
  75. data/lib/datastax_rails/scoping/default.rb +2 -3
  76. data/lib/datastax_rails/scoping/named.rb +3 -5
  77. data/lib/datastax_rails/scoping.rb +11 -12
  78. data/lib/datastax_rails/serialization.rb +34 -31
  79. data/lib/datastax_rails/serializers/xml_serializer.rb +178 -175
  80. data/lib/datastax_rails/timestamps.rb +4 -4
  81. data/lib/datastax_rails/types/dirty_collection.rb +57 -57
  82. data/lib/datastax_rails/types/dynamic_list.rb +1 -1
  83. data/lib/datastax_rails/types/dynamic_map.rb +5 -7
  84. data/lib/datastax_rails/types/dynamic_set.rb +2 -2
  85. data/lib/datastax_rails/util/solr_repair.rb +3 -3
  86. data/lib/datastax_rails/validations/associated.rb +8 -6
  87. data/lib/datastax_rails/validations/uniqueness.rb +8 -8
  88. data/lib/datastax_rails/validations.rb +9 -10
  89. data/lib/datastax_rails/version.rb +2 -1
  90. data/lib/datastax_rails/wide_storage_model.rb +6 -6
  91. data/lib/datastax_rails.rb +13 -9
  92. data/lib/schema_migration.rb +3 -3
  93. data/spec/datastax_rails/associations/belongs_to_association_spec.rb +2 -2
  94. data/spec/datastax_rails/associations/collection_association_spec.rb +14 -14
  95. data/spec/datastax_rails/associations/has_many_association_spec.rb +20 -20
  96. data/spec/datastax_rails/associations_spec.rb +11 -11
  97. data/spec/datastax_rails/attribute_methods_spec.rb +25 -25
  98. data/spec/datastax_rails/base_spec.rb +24 -24
  99. data/spec/datastax_rails/callbacks_spec.rb +21 -21
  100. data/spec/datastax_rails/column_spec.rb +133 -132
  101. data/spec/datastax_rails/connection/statement_cache_spec.rb +2 -2
  102. data/spec/datastax_rails/cql/base_spec.rb +4 -4
  103. data/spec/datastax_rails/cql/delete_spec.rb +19 -0
  104. data/spec/datastax_rails/cql/select_spec.rb +8 -8
  105. data/spec/datastax_rails/cql/update_spec.rb +8 -10
  106. data/spec/datastax_rails/dynamic_model_spec.rb +36 -22
  107. data/spec/datastax_rails/inheritance_spec.rb +11 -14
  108. data/spec/datastax_rails/persistence_spec.rb +73 -74
  109. data/spec/datastax_rails/relation/batches_spec.rb +13 -13
  110. data/spec/datastax_rails/relation/facet_methods_spec.rb +43 -35
  111. data/spec/datastax_rails/relation/finder_methods_spec.rb +77 -78
  112. data/spec/datastax_rails/relation/modification_methods_spec.rb +19 -19
  113. data/spec/datastax_rails/relation/search_methods_spec.rb +160 -160
  114. data/spec/datastax_rails/relation/spawn_methods_spec.rb +18 -18
  115. data/spec/datastax_rails/relation_spec.rb +119 -116
  116. data/spec/datastax_rails/schema/migrator_spec.rb +30 -30
  117. data/spec/datastax_rails/schema/solr_spec.rb +15 -15
  118. data/spec/datastax_rails/scoping/default_spec.rb +9 -9
  119. data/spec/datastax_rails/types/dynamic_list_spec.rb +12 -12
  120. data/spec/datastax_rails/types/dynamic_map_spec.rb +10 -10
  121. data/spec/datastax_rails/types/dynamic_set_spec.rb +22 -10
  122. data/spec/datastax_rails/validations/uniqueness_spec.rb +25 -25
  123. data/spec/datastax_rails/wide_storage_model_spec.rb +11 -0
  124. data/spec/datastax_rails_spec.rb +2 -2
  125. data/spec/dummy/config/application.rb +2 -3
  126. data/spec/dummy/config/boot.rb +1 -1
  127. data/spec/dummy/config/environments/development.rb +3 -3
  128. data/spec/dummy/config/environments/test.rb +1 -1
  129. data/spec/dummy/config/initializers/session_store.rb +1 -1
  130. data/spec/dummy/config/initializers/wrap_parameters.rb +1 -1
  131. data/spec/factories/audit_logs.rb +6 -0
  132. data/spec/factories/hobbies.rb +6 -0
  133. data/spec/factories/people.rb +5 -0
  134. data/spec/feature/dynamic_fields_spec.rb +4 -4
  135. data/spec/feature/overloaded_tables_spec.rb +11 -12
  136. data/spec/spec_helper.rb +17 -14
  137. data/spec/support/datastax_test_hook.rb +2 -2
  138. data/spec/support/default_consistency_shared_examples.rb +11 -11
  139. data/spec/support/models.rb +31 -32
  140. metadata +40 -6
  141. data/lib/datastax_rails/attribute_methods/before_type_cast.rb +0 -71
  142. data/lib/datastax_rails/log_subscriber.rb +0 -0
  143. data/spec/dummy/ks/migrate/20111117224534_models.rb +0 -20
@@ -1,8 +1,8 @@
1
- module DatastaxRails::Associations::Builder
1
+ module DatastaxRails::Associations::Builder # rubocop:disable Style/ClassAndModuleChildren
2
2
  class SingularAssociation < Association #:nodoc:
3
- #self.valid_options += [:remote, :dependent, :counter_cache, :primary_key, :inverse_of]
3
+ # self.valid_options += [:remote, :dependent, :counter_cache, :primary_key, :inverse_of]
4
4
  self.valid_options += [:dependent, :denorm]
5
-
5
+
6
6
  def constructable?
7
7
  true
8
8
  end
@@ -11,7 +11,7 @@ module DatastaxRails::Associations::Builder
11
11
  super
12
12
  define_constructors if constructable?
13
13
  end
14
-
14
+
15
15
  def build
16
16
  relation = super
17
17
  configure_denorm
@@ -19,38 +19,36 @@ module DatastaxRails::Associations::Builder
19
19
  end
20
20
 
21
21
  private
22
-
23
- def configure_denorm
24
- if options[:denorm]
25
- unless options[:denorm].is_a?(Hash)
26
- raise ArgumentError, "The :denorm option expects a hash in the form {:attr_on_other_model => :virtual_attr_on_this_model}"
27
- end
28
-
29
- # options[:denorm].each do |remote, local|
30
- # # Default everything to a string. If it should be something different, the developer can declare the attribute manually.
31
- # model.send(:string, local)
32
- # model.send(:class_eval, <<-eoruby, __FILE__, __LINE__ + 1)
33
- # def #{local}
34
- # eoruby
35
- # end
36
-
37
- end
38
- end
39
22
 
40
- def define_constructors
41
- name = self.name
23
+ def configure_denorm
24
+ return unless options[:denorm]
25
+ options[:denorm].is_a?(Hash) || fail(ArgumentError, 'The :denorm option expects a hash in the form ' \
26
+ '{:attr_on_other_model => :virtual_attr_on_this_model}')
42
27
 
43
- model.redefine_method("build_#{name}") do |*params, &block|
44
- association(name).build(*params, &block)
45
- end
28
+ # options[:denorm].each do |remote, local|
29
+ # # Default everything to a string. If it should be something different,
30
+ # # the developer can declare the attribute manually.
31
+ # model.send(:string, local)
32
+ # model.send(:class_eval, <<-eoruby, __FILE__, __LINE__ + 1)
33
+ # def #{local}
34
+ # eoruby
35
+ # end
36
+ end
46
37
 
47
- model.redefine_method("create_#{name}") do |*params, &block|
48
- association(name).create(*params, &block)
49
- end
38
+ def define_constructors
39
+ name = self.name
50
40
 
51
- model.redefine_method("create_#{name}!") do |*params, &block|
52
- association(name).create!(*params, &block)
53
- end
41
+ model.redefine_method("build_#{name}") do |*params, &block|
42
+ association(name).build(*params, &block)
54
43
  end
44
+
45
+ model.redefine_method("create_#{name}") do |*params, &block|
46
+ association(name).create(*params, &block)
47
+ end
48
+
49
+ model.redefine_method("create_#{name}!") do |*params, &block|
50
+ association(name).create!(*params, &block)
51
+ end
52
+ end
55
53
  end
56
- end
54
+ end
@@ -17,14 +17,14 @@ module DatastaxRails
17
17
  # +load_target+ and the +loaded+ flag are your friends.
18
18
  class CollectionAssociation < Association #:nodoc:
19
19
  attr_reader :proxy
20
-
21
- delegate :first, :last, :to => :scoped
22
-
20
+
21
+ delegate :first, :last, to: :scoped
22
+
23
23
  def initialize(owner, reflection)
24
24
  super
25
25
  @proxy = CollectionProxy.new(self)
26
26
  end
27
-
27
+
28
28
  def size
29
29
  if !find_target? || loaded?
30
30
  target.size
@@ -36,33 +36,30 @@ module DatastaxRails
36
36
  end
37
37
  end
38
38
  alias_method :count, :size
39
-
39
+
40
40
  def empty?
41
41
  size == 0
42
42
  end
43
-
43
+
44
44
  def any?
45
45
  size > 0
46
46
  end
47
-
47
+
48
48
  def many?
49
49
  size > 1
50
50
  end
51
-
51
+
52
52
  # Implements the reader method, e.g. foo.items for Foo.has_many :items
53
53
  def reader(force_reload = false)
54
- if force_reload || stale_target?
55
- reload
56
- end
57
-
54
+ reload if force_reload || stale_target?
58
55
  proxy
59
56
  end
60
-
57
+
61
58
  # Implements the writer method, e.g. foo.items= for Foo.has_many :items
62
59
  def writer(records)
63
60
  replace(records)
64
61
  end
65
-
62
+
66
63
  # Implements the ids reader method, e.g. foo.item_ids for Foo.has_many :items
67
64
  def ids_reader
68
65
  if loaded?
@@ -75,21 +72,21 @@ module DatastaxRails
75
72
  end
76
73
  end
77
74
  end
78
-
75
+
79
76
  # Implements the ids writer method, e.g. foo.item_ids= for Foo.has_many :items
80
77
  def ids_writer(ids)
81
78
  ids = Array.wrap(ids).reject { |id| id.blank? }
82
79
  replace(klass.find(ids).index_by { |r| r.id }.values_at(*ids))
83
80
  end
84
-
81
+
85
82
  def reset
86
83
  @loaded = false
87
84
  @target = []
88
85
  end
89
-
86
+
90
87
  def build(attributes = {}, options = {}, &block)
91
88
  if attributes.is_a?(Array)
92
- attributes.collect { |attr| build(attr, options, &block) }
89
+ attributes.map { |attr| build(attr, options, &block) }
93
90
  else
94
91
  add_to_target(build_record(attributes, options)) do |record|
95
92
  yield(record) if block_given?
@@ -104,7 +101,7 @@ module DatastaxRails
104
101
  def create!(attributes = {}, options = {}, &block)
105
102
  create_record(attributes, options, true, &block)
106
103
  end
107
-
104
+
108
105
  # Remove all records from this association
109
106
  #
110
107
  # See delete for more info.
@@ -124,7 +121,7 @@ module DatastaxRails
124
121
  loaded!
125
122
  end
126
123
  end
127
-
124
+
128
125
  # Removes +records+ from this association calling +before_remove+ and
129
126
  # +after_remove+ callbacks.
130
127
  #
@@ -142,31 +139,28 @@ module DatastaxRails
142
139
  # Note that this method will _always_ remove records from the database
143
140
  # ignoring the +:dependent+ option.
144
141
  def destroy(*records)
145
- records = find(records) if records.any? { |record| record.kind_of?(Fixnum) || record.kind_of?(String) }
142
+ records = find(records) if records.any? { |record| record.is_a?(Fixnum) || record.is_a?(String) }
146
143
  delete_or_destroy(records, :destroy)
147
144
  end
148
-
145
+
149
146
  def uniq(collection = load_target)
150
147
  seen = {}
151
- collection.find_all do |record|
148
+ collection.select do |record|
152
149
  seen[record.id] = true unless seen.key?(record.id)
153
150
  end
154
151
  end
155
-
156
- def load_target
157
- if find_target?
158
- @target = merge_target_lists(find_target, target)
159
- end
160
152
 
153
+ def load_target
154
+ @target = merge_target_lists(find_target, target) if find_target?
161
155
  loaded!
162
156
  target
163
157
  end
164
-
158
+
165
159
  def add_to_target(record)
166
160
  callback(:before_add, record)
167
161
  yield(record) if block_given?
168
162
 
169
- if options[:uniq] && index = @target.index(record)
163
+ if options[:uniq] && (index = @target.index(record))
170
164
  @target[index] = record
171
165
  else
172
166
  @target << record
@@ -177,7 +171,7 @@ module DatastaxRails
177
171
 
178
172
  record
179
173
  end
180
-
174
+
181
175
  # Replace this collection with +other_array+
182
176
  # This will perform a diff and delete/add only records that have changed.
183
177
  def replace(other_array)
@@ -186,13 +180,13 @@ module DatastaxRails
186
180
 
187
181
  delete(target - other_array)
188
182
 
189
- unless concat(other_array - target)
183
+ unless concat(other_array - target) # rubocop:disable Style/GuardClause
190
184
  @target = original_target
191
- raise RecordNotSaved, "Failed to replace #{reflection.name} because one or more of the " \
192
- "new records could not be saved."
185
+ fail RecordNotSaved, "Failed to replace #{reflection.name} because one or more of the " \
186
+ 'new records could not be saved.'
193
187
  end
194
188
  end
195
-
189
+
196
190
  # Add +records+ to this association. Returns +self+ so method calls may be chained.
197
191
  # Since << flattens its argument list and inserts each record, +push+ and +concat+ behave identically.
198
192
  def concat(*records)
@@ -201,129 +195,129 @@ module DatastaxRails
201
195
 
202
196
  records.flatten.each do |record|
203
197
  raise_on_type_mismatch(record)
204
- add_to_target(record) do |r|
198
+ add_to_target(record) do |_r|
205
199
  result &&= insert_record(record) unless owner.new_record?
206
200
  end
207
201
  end
208
202
 
209
203
  result && records
210
204
  end
211
-
205
+
212
206
  private
213
-
214
- # We have some records loaded from the database (persisted) and some that are
215
- # in-memory (memory). The same record may be represented in the persisted array
216
- # and in the memory array.
217
- #
218
- # So the task of this method is to merge them according to the following rules:
219
- #
220
- # * The final array must not have duplicates
221
- # * The order of the persisted array is to be preserved
222
- # * Any changes made to attributes on objects in the memory array are to be preserved
223
- # * Otherwise, attributes should have the value found in the database
224
- def merge_target_lists(persisted, memory)
225
- return persisted if memory.empty?
226
- return memory if persisted.empty?
227
-
228
- persisted.map! do |record|
229
- # Unfortunately we cannot simply do memory.delete(record) since on 1.8 this returns
230
- # record rather than memory.at(memory.index(record)). The behavior is fixed in 1.9.
231
- mem_index = memory.index(record)
232
-
233
- if mem_index
234
- mem_record = memory.delete_at(mem_index)
235
-
236
- (record.attribute_names - mem_record.changes.keys).each do |name|
237
- mem_record[name] = record[name]
238
- end
239
-
240
- mem_record
241
- else
242
- record
243
- end
244
- end
245
207
 
246
- persisted + memory
247
- end
248
-
249
- def find_target
250
- records = scoped.all
251
- records = options[:uniq] ? uniq(records) : records
252
- records.each { |record| set_inverse_instance(record) }
253
- records
254
- end
255
-
256
- def create_record(attributes, options, raise = false, &block)
257
- unless owner.persisted?
258
- raise DatastaxRails::RecordNotSaved, "You cannot call create unless the parent is saved"
259
- end
208
+ # We have some records loaded from the database (persisted) and some that are
209
+ # in-memory (memory). The same record may be represented in the persisted array
210
+ # and in the memory array.
211
+ #
212
+ # So the task of this method is to merge them according to the following rules:
213
+ #
214
+ # * The final array must not have duplicates
215
+ # * The order of the persisted array is to be preserved
216
+ # * Any changes made to attributes on objects in the memory array are to be preserved
217
+ # * Otherwise, attributes should have the value found in the database
218
+ def merge_target_lists(persisted, memory)
219
+ return persisted if memory.empty?
220
+ return memory if persisted.empty?
260
221
 
261
- if attributes.is_a?(Array)
262
- attributes.collect { |attr| create_record(attr, options, raise, &block) }
263
- else
264
- add_to_target(build_record(attributes, options)) do |record|
265
- yield(record) if block_given?
266
- insert_record(record, true, raise)
222
+ persisted.map! do |record|
223
+ # Unfortunately we cannot simply do memory.delete(record) since on 1.8 this returns
224
+ # record rather than memory.at(memory.index(record)). The behavior is fixed in 1.9.
225
+ mem_index = memory.index(record)
226
+
227
+ if mem_index
228
+ mem_record = memory.delete_at(mem_index)
229
+
230
+ (record.attribute_names - mem_record.changes.keys).each do |name|
231
+ mem_record[name] = record[name]
267
232
  end
233
+
234
+ mem_record
235
+ else
236
+ record
268
237
  end
269
238
  end
270
239
 
271
- # Do the relevant stuff to insert the given record into the association collection.
272
- def insert_record(record, validate = true, raise = false)
273
- raise NotImplementedError
240
+ persisted + memory
241
+ end
242
+
243
+ def find_target
244
+ records = scoped.all
245
+ records = options[:uniq] ? uniq(records) : records
246
+ records.each { |record| set_inverse_instance(record) }
247
+ records
248
+ end
249
+
250
+ def create_record(attributes, options, raise = false, &block)
251
+ unless owner.persisted?
252
+ fail DatastaxRails::RecordNotSaved, 'You cannot call create unless the parent is saved'
274
253
  end
275
-
276
- def create_scope
277
- scoped.scope_for_create.stringify_keys
254
+
255
+ if attributes.is_a?(Array)
256
+ attributes.map { |attr| create_record(attr, options, raise, &block) }
257
+ else
258
+ add_to_target(build_record(attributes, options)) do |record|
259
+ yield(record) if block_given?
260
+ insert_record(record, true, raise)
261
+ end
278
262
  end
263
+ end
279
264
 
280
- def delete_or_destroy(records, method)
281
- records = records.flatten
282
- records.each { |record| raise_on_type_mismatch(record) }
283
- existing_records = records.reject { |r| r.new_record? }
265
+ # Do the relevant stuff to insert the given record into the association collection.
266
+ def insert_record(_record, _validate = true, _raise = false)
267
+ fail NotImplementedError
268
+ end
284
269
 
285
- records.each { |record| callback(:before_remove, record) }
270
+ def create_scope
271
+ scoped.scope_for_create.stringify_keys
272
+ end
286
273
 
287
- delete_records(existing_records, method) if existing_records.any?
288
- records.each { |record| target.delete(record) }
274
+ def delete_or_destroy(records, method)
275
+ records = records.flatten
276
+ records.each { |record| raise_on_type_mismatch(record) }
277
+ existing_records = records.reject { |r| r.new_record? }
289
278
 
290
- records.each { |record| callback(:after_remove, record) }
291
- end
292
-
293
- # Delete the given records from the association, using one of the methods :destroy,
294
- # :delete_all or :nullify (or nil, in which case a default is used).
295
- def delete_records(records, method)
296
- raise NotImplementedError
297
- end
279
+ records.each { |record| callback(:before_remove, record) }
298
280
 
299
- def callback(method, record)
300
- callbacks_for(method).each do |callback|
301
- case callback
302
- when Symbol
303
- owner.send(callback, record)
304
- when Proc
305
- callback.call(owner, record)
306
- else
307
- callback.send(method, owner, record)
308
- end
309
- end
310
- end
281
+ delete_records(existing_records, method) if existing_records.any?
282
+ records.each { |record| target.delete(record) }
311
283
 
312
- def callbacks_for(callback_name)
313
- full_callback_name = "#{callback_name}_for_#{reflection.name}"
314
- owner.class.send(full_callback_name.to_sym) || []
315
- end
316
-
317
- def include_in_memory?(record)
318
- if reflection.is_a?(DatastaxRails::Reflection::ThroughReflection)
319
- owner.send(reflection.through_reflection.name).any? { |source|
320
- target = source.send(reflection.source_reflection.name)
321
- target.respond_to?(:include?) ? target.include?(record) : target == record
322
- } || target.include?(record)
284
+ records.each { |record| callback(:after_remove, record) }
285
+ end
286
+
287
+ # Delete the given records from the association, using one of the methods :destroy,
288
+ # :delete_all or :nullify (or nil, in which case a default is used).
289
+ def delete_records(_records, _method)
290
+ fail NotImplementedError
291
+ end
292
+
293
+ def callback(method, record)
294
+ callbacks_for(method).each do |callback|
295
+ case callback
296
+ when Symbol
297
+ owner.send(callback, record)
298
+ when Proc
299
+ callback.call(owner, record)
323
300
  else
324
- target.include?(record)
301
+ callback.send(method, owner, record)
325
302
  end
326
303
  end
304
+ end
305
+
306
+ def callbacks_for(callback_name)
307
+ full_callback_name = "#{callback_name}_for_#{reflection.name}"
308
+ owner.class.send(full_callback_name.to_sym) || []
309
+ end
310
+
311
+ def include_in_memory?(record)
312
+ if reflection.is_a?(DatastaxRails::Reflection::ThroughReflection)
313
+ owner.send(reflection.through_reflection.name).any? do |source|
314
+ target = source.send(reflection.source_reflection.name)
315
+ target.respond_to?(:include?) ? target.include?(record) : target == record
316
+ end || target.include?(record)
317
+ else
318
+ target.include?(record)
319
+ end
320
+ end
327
321
  end
328
322
  end
329
- end
323
+ end