Module: ActiveLoaders::Adapters::ActiveModelSerializers

Defined in:
lib/active_loaders/datasource_adapter.rb

Defined Under Namespace

Modules: ArraySerializer

Class Method Summary collapse

Class Method Details

.get_serializer_for(klass, serializer_assoc = nil) ⇒ Object



44
45
46
47
48
49
50
51
52
53
# File 'lib/active_loaders/datasource_adapter.rb', line 44

def get_serializer_for(klass, serializer_assoc = nil)
  serializer = if serializer_assoc
    if serializer_assoc.kind_of?(Hash)
      serializer_assoc[:options].try(:[], :serializer)
    else
      serializer_assoc.options[:serializer]
    end
  end
  serializer || "#{klass.name}Serializer".constantize
end

.to_datasource_select(result, klass, serializer = nil, serializer_assoc = nil, adapter = nil, datasource = nil) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/active_loaders/datasource_adapter.rb', line 55

def to_datasource_select(result, klass, serializer = nil, serializer_assoc = nil, adapter = nil, datasource = nil)
  adapter ||= Datasource::Base.default_adapter
  serializer ||= get_serializer_for(klass, serializer_assoc)
  if serializer._attributes.respond_to?(:keys)  # AMS 0.8
    result.concat(serializer._attributes.keys)
  else                                          # AMS 0.9
    result.concat(serializer._attributes)
  end
  result.concat(serializer.loaders_context.select)
  if serializer.loaders_context.skip_select.empty?
    result.unshift("*")
  else
    datasource_class = if datasource
      datasource.class
    else
      serializer.use_datasource || klass.default_datasource
    end
    result.concat(datasource_class._column_attribute_names -
      serializer.loaders_context.skip_select.map(&:to_s))
  end
  result_assocs = serializer.loaders_context.includes.dup
  result.push(result_assocs)

  serializer._associations.each_pair do |name, serializer_assoc|
    # TODO: what if assoc is renamed in serializer?
    reflection = adapter.association_reflection(klass, name.to_sym)
    assoc_class = reflection[:klass]

    name = name.to_s
    result_assocs[name] = []
    to_datasource_select(result_assocs[name], assoc_class, nil, serializer_assoc, adapter)
  end
rescue Exception => ex
  if ex.is_a?(SystemStackError) || ex.is_a?(Datasource::RecursionError)
    fail Datasource::RecursionError, "recursive association (involving #{klass.name})"
  else
    raise
  end
end