class Graphiform::AssociationSource
Public Class Methods
new(model, attribute, **options)
click to toggle source
Calls superclass method
# File lib/graphiform/association_source.rb, line 5 def initialize(model, attribute, **options) super() @model = model @attribute = attribute @options = options end
Public Instance Methods
fetch(values)
click to toggle source
# File lib/graphiform/association_source.rb, line 13 def fetch(values) normalized_values = normalize_values(values) records = query(normalized_values.uniq).to_a results(normalized_values, records) end
normalize_value(value)
click to toggle source
# File lib/graphiform/association_source.rb, line 31 def normalize_value(value) value = value.downcase if !@options[:case_sensitive] && value.is_a?(String) value end
normalize_values(values)
click to toggle source
# File lib/graphiform/association_source.rb, line 37 def normalize_values(values) type_for_attribute = @model.type_for_attribute(@attribute) if @model.respond_to?(:type_for_attribute) values.map do |value| value = type_for_attribute.cast(value) if type_for_attribute.present? normalize_value(value) end end
query(values)
click to toggle source
# File lib/graphiform/association_source.rb, line 19 def query(values) query = @model query = query.merge(@model.instance_exec(&@options[:scope])) if @options[:scope].present? query = query.where(@attribute => values) query = query.includes(@options[:includes]) if @options[:includes].present? && query.respond_to?(:includes) query = query.apply_filters(@options[:where].to_h) if @options[:where].present? && query.respond_to?(:apply_filters) query = query.apply_sorts(@options[:sort].to_h) if @options[:sort].present? && query.respond_to?(:apply_sorts) query end
results(values, records)
click to toggle source
# File lib/graphiform/association_source.rb, line 45 def results(values, records) record_attributes = records.map { |record| normalize_value(record[@attribute]) } values.map do |value| if @options[:multi] indexes = record_attributes.each_index.select { |index| record_attributes[index] == value } indexes.map { |index| index && records[index] } else index = record_attributes.index(value) index && records[index] end end end