Skip to content

Commit cf58eed

Browse files
committed
last fixes and cleanups
1 parent d4b56b7 commit cf58eed

5 files changed

Lines changed: 20 additions & 15 deletions

File tree

ruby/hyper-model/lib/reactive_record/active_record/class_methods.rb

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def __hyperstack_preprocess_attrs(attrs)
5757
end
5858
dealiased_attrs = {}
5959
attrs.each { |attr, value| dealiased_attrs[_dealias_attribute(attr)] = value }
60+
dealiased_attrs
6061
end
6162

6263
def find(*args)
@@ -297,11 +298,12 @@ def abstract_class=(val)
297298
assoc = Associations::AssociationReflection.new(self, macro, name, opts)
298299
if macro == :has_many
299300
define_method(name) { @backing_record.get_has_many(assoc, nil) }
300-
define_method("#{name}=") { |val| @backing_record.set_has_many(assoc, val) }
301+
define_method("_hyperstack_internal_setter_#{name}") { |val| @backing_record.set_has_many(assoc, val) }
301302
else
302303
define_method(name) { @backing_record.get_belongs_to(assoc, nil) }
303-
define_method("#{name}=") { |val| @backing_record.set_belongs_to(assoc, val) }
304+
define_method("_hyperstack_internal_setter_#{name}") { |val| @backing_record.set_belongs_to(assoc, val) }
304305
end
306+
alias_method "#{name}=", "_hyperstack_internal_setter_#{name}"
305307
assoc
306308
end
307309
end
@@ -310,11 +312,12 @@ def composed_of(name, opts = {})
310312
reflection = Aggregations::AggregationReflection.new(base_class, :composed_of, name, opts)
311313
if reflection.klass < ActiveRecord::Base
312314
define_method(name) { @backing_record.get_ar_aggregate(reflection, nil) }
313-
define_method("#{name}=") { |val| @backing_record.set_ar_aggregate(reflection, val) }
315+
define_method("_hyperstack_internal_setter_#{name}") { |val| @backing_record.set_ar_aggregate(reflection, val) }
314316
else
315317
define_method(name) { @backing_record.get_non_ar_aggregate(name, nil) }
316-
define_method("#{name}=") { |val| @backing_record.set_non_ar_aggregate(reflection, val) }
318+
define_method("_hyperstack_internal_setter_#{name}") { |val| @backing_record.set_non_ar_aggregate(reflection, val) }
317319
end
320+
alias_method "#{name}=", "_hyperstack_internal_setter_#{name}"
318321
end
319322

320323
def column_names
@@ -339,6 +342,9 @@ def server_method(name, default: nil)
339342
vector = args.count.zero? ? name : [[name] + args]
340343
@backing_record.get_server_method(vector, true)
341344
end
345+
define_method("_hyperstack_internal_setter_#{name}") do |val|
346+
backing_record.set_attr_value(name, val)
347+
end
342348
end
343349

344350
# def define_attribute_methods
@@ -366,7 +372,8 @@ def define_attribute_methods
366372

367373
define_method(name) { @backing_record.get_attr_value(name, nil) } unless method_defined?(name)
368374
define_method("#{name}!") { @backing_record.get_attr_value(name, true) } unless method_defined?("#{name}!")
369-
define_method("#{name}=") { |val| @backing_record.set_attr_value(name, val) } unless method_defined?("#{name}=")
375+
define_method("_hyperstack_internal_setter_#{name}") { |val| @backing_record.set_attr_value(name, val) }
376+
alias_method "#{name}=", "_hyperstack_internal_setter_#{name}" unless method_defined?("#{name}=")
370377
define_method("#{name}_changed?") { @backing_record.changed?(name) } unless method_defined?("#{name}_changed?")
371378
define_method("#{name}?") { @backing_record.get_attr_value(name, nil).present? } unless method_defined?("#{name}?")
372379
end
@@ -384,7 +391,6 @@ def _react_param_conversion(param, opt = nil)
384391
klass = ReactiveRecord::Base.infer_type_from_hash(self, param)
385392
klass == self || klass < self
386393
else
387-
#debugger if param[:duplicate_of_id]
388394
# TODO: investigate saving .changes here and then replacing the
389395
# TODO: changes after the load is complete. In other words preserve the
390396
# TODO: changed values as changes while just updating the synced values.

ruby/hyper-model/lib/reactive_record/active_record/instance_methods.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ def method_missing(missing, *args, &block)
1717
end
1818
end
1919

20+
# ignore load_from_json when it calls _hyperstack_internal_setter_id
21+
def _hyperstack_internal_setter_id(*); end
22+
2023
def inspect
2124
"<#{model_name}:#{ReactiveRecord::Operations::Base::FORMAT % to_key} "\
2225
"(#{ReactiveRecord::Operations::Base::FORMAT % object_id}) "\

ruby/hyper-model/lib/reactive_record/server_data_cache.rb

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -492,15 +492,7 @@ def self.load_from_json(tree, target = nil)
492492

493493
target.send "#{method}=", value.first
494494
elsif value.is_a? Array
495-
unless method == :id
496-
# we cannot always use target.send "#{method}=" here because it might be a server method, which does not have a setter
497-
# a better fix might be something like target._internal_attribute_hash[method] = ...
498-
if target.respond_to?("#{method}=")
499-
target.send("#{method}=", value.first)
500-
else
501-
target.backing_record.set_attr_value(method, value.first) unless method == :id
502-
end
503-
end
495+
target.send("_hyperstack_internal_setter_#{method}", value.first)
504496
elsif value.is_a?(Hash) && value[:id] && value[:id].first && (association = target.class.reflect_on_association(method))
505497
# not sure if its necessary to check the id above... is it possible to for the method to be an association but not have an id?
506498
klass = value[:model_name] ? Object.const_get(value[:model_name].first) : association.klass

ruby/hyper-model/spec/batch1/misc/method_override_spec.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
RSpec::Steps.steps "overriding attribute methods", js: true do
66

7+
before(:all) do
8+
TypeTest.build_tables
9+
end
10+
711
it 'can override the getter' do
812
expect_evaluate_ruby do
913
TypeTest.class_eval do

ruby/hyper-model/spec/batch7/self_referencing_belongs_to_spec.rb renamed to ruby/hyper-model/spec/batch1/misc/self_referencing_belongs_to_spec.rb

File renamed without changes.

0 commit comments

Comments
 (0)