Module: ArSync::TreeSync::ClassMethods

Includes:
ClassMethodsBase
Defined in:
lib/ar_sync/class_methods.rb

Instance Method Summary collapse

Methods included from ClassMethodsBase

#_each_sync_child, #_each_sync_parent, #_sync_child_info, #_sync_children_info, #_sync_parents_info, #_sync_self?, #sync_parent

Instance Method Details

#_initialize_sync_callbacksObject



99
100
101
102
103
104
105
106
107
108
109
# File 'lib/ar_sync/class_methods.rb', line 99

def _initialize_sync_callbacks
  return if instance_variable_defined? '@_sync_callbacks_initialized'
  @_sync_callbacks_initialized = true
  _sync_define ArSync::DataField.new(:id)
  %i[create update destroy].each do |action|
    after_commit on: action do
      next if ArSync.skip_notification?
      self.class.default_scoped.scoping { _sync_notify action }
    end
  end
end

#_sync_define(info, **option, &data_block) ⇒ Object



86
87
88
89
90
91
# File 'lib/ar_sync/class_methods.rb', line 86

def _sync_define(info, **option, &data_block)
  _initialize_sync_callbacks
  _sync_children_info[info.name] = info
  serializer_field info.name, **option, &data_block unless _serializer_field_info info.name
  serializer_field info.name, **option, namespace: :sync, &data_block
end

#sync_collection(name) ⇒ Object



44
45
46
# File 'lib/ar_sync/class_methods.rb', line 44

def sync_collection(name)
  ArSync::Collection::Tree.find self, name
end

#sync_define_collection(name, limit: nil, order: :asc) ⇒ Object



93
94
95
96
97
# File 'lib/ar_sync/class_methods.rb', line 93

def sync_define_collection(name, limit: nil, order: :asc)
  _initialize_sync_callbacks
  collection = ArSync::Collection::Tree.new self, name, limit: limit, order: order
  sync_parent collection, inverse_of: [self, name]
end

#sync_has_data(*names, **option, &original_data_block) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/ar_sync/class_methods.rb', line 48

def sync_has_data(*names, **option, &original_data_block)
  @_sync_self = true
  option = option.dup
  if original_data_block
    data_block = ->(*args) { instance_exec(*args, &original_data_block).as_json }
  end
  option[:params_type] = {}
  names.each do |name|
    type_override = data_block.nil? && reflect_on_association(name.to_s.underscore) ? { type: :any } : {}
    _sync_define ArSync::DataField.new(name), option.merge(type_override), &data_block
  end
end

#sync_has_many(name, order: :asc, propagate_when: nil, params_type: nil, limit: nil, preload: nil, association: nil, **option, &data_block) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/ar_sync/class_methods.rb', line 65

def sync_has_many(name, order: :asc, propagate_when: nil, params_type: nil, limit: nil, preload: nil, association: nil, **option, &data_block)
  if data_block.nil? && preload.nil?
    underscore_name = name.to_s.underscore.to_sym
    preload = lambda do |records, _context, params|
      ArSerializer::Field.preload_association(
        self, records, association || underscore_name,
        order: (!limit && params && params[:order]) || order,
        limit: [params && params[:limit]&.to_i, limit].compact.min
      )
    end
    data_block = lambda do |preloaded, _context, _params|
      preloaded ? preloaded[id] || [] : send(name)
    end
    params_type = { limit?: :int, order?: [{ :* => %w[asc desc] }, 'asc', 'desc'] }
  else
    params_type = {}
  end
  field = ArSync::HasManyField.new name, association: association, order: order, limit: limit, propagate_when: propagate_when
  _sync_define field, preload: preload, association: association, params_type: params_type, **option, &data_block
end

#sync_has_one(name, **option, &data_block) ⇒ Object



61
62
63
# File 'lib/ar_sync/class_methods.rb', line 61

def sync_has_one(name, **option, &data_block)
  _sync_define ArSync::HasOneField.new(name), option, &data_block
end