class Hario::PluckParser

Attributes

join_clause[RW]
pluck_clause[RW]

Public Class Methods

new(pluck, klass) click to toggle source
# File lib/hario/behaviours/pluck.rb, line 9
def initialize(pluck, klass)
  @pluck = pluck
  @klass = klass

  parse_pluck
end

Private Instance Methods

parse_namespace(namespace) click to toggle source
# File lib/hario/behaviours/pluck.rb, line 42
def parse_namespace(namespace)
  parts = namespace.split('.')
  attribute = parts.pop
  association_chain = parts

  [association_chain, attribute]
end
parse_pluck() click to toggle source
# File lib/hario/behaviours/pluck.rb, line 17
def parse_pluck
  @join_clause = {}
  @pluck_clause = [[@klass.table_name, 'id'].join('.')]

  ns, no_ns = @pluck.partition{ |p| p.include?('.') }

  no_ns.each do |p|
    raise_if_unlisted_attribute!(:pluck, @klass, p)
    @pluck_clause << [@klass.table_name, p].join('.')
  end

  ns.each do |p|
    association_chain, attribute = parse_namespace(p)

    end_model = end_model_from_association_chain(association_chain)
    raise_if_unlisted_attribute!(:pluck, end_model, attribute)

    nested_associations = (association_chain.dup << {}).reverse.inject { |v, key| { key => v } }
    @join_clause.deep_merge!(nested_associations)

    attribute_table = table_name_from_association_chain(association_chain)
    @pluck_clause << [attribute_table, attribute].join('.')
  end
end