Sha256: 9c5d6a3e3c1e183203bb504b463de7271d4a44370430f03b23637d26d77705f9

Contents?: true

Size: 1.61 KB

Versions: 1

Compression:

Stored size: 1.61 KB

Contents

# frozen_string_literal: true

module Phlexi
  module Form
    module FieldOptions
      module Collection
        def collection(collection = nil)
          if collection.nil?
            options[:collection] = options.fetch(:collection) { infer_collection }
          else
            options[:collection] = collection
            self
          end
        end

        private

        def infer_collection
          collection_value_from_association || collection_value_from_validator
        end

        def collection_value_from_association
          return unless reflection

          relation = reflection.klass.all

          if reflection.respond_to?(:scope) && reflection.scope
            relation = if reflection.scope.parameters.any?
              reflection.klass.instance_exec(object, &reflection.scope)
            else
              reflection.klass.instance_exec(&reflection.scope)
            end
          else
            order = reflection.options[:order]
            conditions = reflection.options[:conditions]
            conditions = object.instance_exec(&conditions) if conditions.respond_to?(:call)

            relation = relation.where(conditions) if relation.respond_to?(:where) && conditions.present?
            relation = relation.order(order) if relation.respond_to?(:order)
          end

          relation
        end

        def collection_value_from_validator
          return unless has_validators?

          inclusion_validator = find_validator(:inclusion)
          inclusion_validator.options[:in] || inclusion_validator.options[:within] if inclusion_validator
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
phlexi-form-0.3.0.rc1 lib/phlexi/form/field_options/collection.rb