class ActiveModel::Serializer
def associate(klass, *attrs)
def associate(klass, *attrs) options = attrs.extract_options! attrs.each do |attr| define_method attr do object.send attr end unless method_defined?(attr) @_associations[attr] = klass.new(attr, options) end end
def associations
def associations associations = self.class._associations included_associations = filter(associations.keys) associations.each_with_object({}) do |(name, association), hash| if included_associations.include? name if association.embed_ids? hash[association.key] = serialize_ids association elsif association.embed_objects? hash[association.embedded_key] = serialize association end end end end
def attributes(*attrs)
def attributes(*attrs) @_attributes.concat attrs attrs.each do |attr| define_method attr do object.read_attribute_for_serialization attr end unless method_defined?(attr) end end
def attributes
def attributes filter(self.class._attributes.dup).each_with_object({}) do |name, hash| hash[name] = send(name) end end
def build_serializer(association)
def build_serializer(association) object = send(association.name) association.build_serializer(object, scope: scope) end
def embed(type, options={})
def embed(type, options={}) CONFIG.embed = type CONFIG.embed_in_root = true if options[:embed_in_root] || options[:include] ActiveSupport::Deprecation.warn <<-WARN ice: embed is deprecated. ** e of .embed method on a Serializer will be soon removed, as this should have a global scope and not a class scope. use the global .setup method instead: Model::Serializer.setup do |config| ig.embed = :#{type} ig.embed_in_root = #{CONFIG.embed_in_root || false} WARN end
def embedded_in_root_associations
def embedded_in_root_associations associations = self.class._associations included_associations = filter(associations.keys) associations.each_with_object({}) do |(name, association), hash| if included_associations.include? name if association.embed_in_root? association_serializer = build_serializer(association) hash.merge! association_serializer.embedded_in_root_associations serialized_data = association_serializer.serializable_object key = association.root_key if hash.has_key?(key) hash[key].concat(serialized_data).uniq! else hash[key] = serialized_data end end end end end
def filter(keys)
def filter(keys) keys end
def has_many(*attrs)
def has_many(*attrs) associate(Association::HasMany, *attrs) end
def has_one(*attrs)
def has_one(*attrs) associate(Association::HasOne, *attrs) end
def inherited(base)
def inherited(base) base._root = _root base._attributes = (_attributes || []).dup base._associations = (_associations || {}).dup end
def initialize(object, options={})
def initialize(object, options={}) @object = object @scope = options[:scope] @root = options.fetch(:root, self.class._root) @meta_key = options[:meta_key] || :meta @meta = options[@meta_key] @wrap_in_array = options[:_wrap_in_array] end
def json_key
def json_key if root == true || root.nil? self.class.root_name else root end end
def root_name
def root_name name.demodulize.underscore.sub(/_serializer$/, '') if name end
def serializable_object(options={})
def serializable_object(options={}) return nil if object.nil? hash = attributes hash.merge! associations @wrap_in_array ? [hash] : hash end
def serialize(association)
def serialize(association) build_serializer(association).serializable_object end
def serialize_ids(association)
def serialize_ids(association) associated_data = send(association.name) if associated_data.respond_to?(:to_ary) associated_data.map { |elem| elem.read_attribute_for_serialization(association.embed_key) } else associated_data.read_attribute_for_serialization(association.embed_key) if associated_data end end
def serializer_for(resource)
def serializer_for(resource) if resource.respond_to?(:to_ary) ArraySerializer else begin Object.const_get "#{resource.class.name}Serializer" rescue NameError nil end end end
def serializer_for(resource)
def serializer_for(resource) if resource.respond_to?(:to_ary) ArraySerializer else "#{resource.class.name}Serializer".safe_constantize end end
def setup
def setup @mutex.synchronize do yield CONFIG end end