Sha256: 20fdf40d39afdd635300a8002fb94bda7c4612d3436b4ecc9714e60123a9d8d9

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

module ForestRails
  class SerializerFactory
    def initialize
      @serializers = {}
    end

    def serializer_for(active_record_class)
      overriden_serializer(active_record_class) ||
        registered_serializer(active_record_class) ||
        generated_serializer(active_record_class)
    end

    private

    def overriden_serializer(active_record_class)
      begin
        "ForestRails::#{active_record_class}Serializer".constantize;
      rescue
      end
    end

    def registered_serializer(active_record_class)
      @serializers[key(active_record_class)]
    end

    def generated_serializer(active_record_class)
      associations = active_record_class.reflect_on_all_associations
      column_names = active_record_class.column_names
      key = key(active_record_class)

      serializer = @serializers[key] = Class.new(ActiveModel::Serializer)
      serializer.attributes(*column_names)
      associations.each do |association|
        serializer.send(
          association.macro, association.name,
          serializer: serializer_for(association.active_record))
      end
      serializer
    end

    def key(active_record_class)
      active_record_class.to_s.tableize.to_sym
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
forest_rails-0.0.4 app/serializers/forest_rails/serializer_factory.rb