Sha256: bc3832021f94b59606283e454e34490c5d112a01b4ab6d79462d449735df9dba

Contents?: true

Size: 1.35 KB

Versions: 2

Compression:

Stored size: 1.35 KB

Contents

class SerializerFieldFilter
  module Relation
    extend ActiveSupport::Concern
    included do
      [:has_many, :belongs_to, :has_one].each do |relation_method_name|
        class_eval <<-RUBY
          def self.#{relation_method_name}_with_filter(resource_name, serializer: nil)
            attribute resource_name
            resource_method_module = Module.new do
              define_method resource_name do
                filter = instance_options[:field_filter]&.scope_of(resource_name)
                resource_options = filter.resource_options.merge({
                  serializer: serializer,
                })
                resources = defined?(super) ? super() : object.send(resource_name)
                if "#{relation_method_name}" == "has_many"
                  resources.to_a.map do |resource|
                    serializer_for_resource(resource, resource_options) if resource.present?
                  end
                else
                  serializer_for_resource(resources, resource_options) if resources.present?
                end
              end
            end
            prepend resource_method_module
          end
        RUBY
      end

      private

      def serializer_for_resource(resource, resource_options)
        ActiveModelSerializers::SerializableResource.new(resource, resource_options).as_json
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
serializer_field_filter-0.0.2 lib/serializer_field_filter/relation.rb
serializer_field_filter-0.0.1 lib/serializer_field_filter/relation.rb