module NoBrainer::Criteria::Pluck

Public Class Methods

merge_missing_attributes(a, b) click to toggle source
# File lib/no_brainer/criteria/pluck.rb, line 23
def self.merge_missing_attributes(a, b)
  return nil if b.nil? || b == :remove

  a = a ? a.dup : {}
  b.each do |type, attrs|
    old_attrs = a[type] || {}.with_indifferent_access
    new_attrs = old_attrs.deep_merge(attrs)
    a[type] = new_attrs
  end
  a
end

Public Instance Methods

lazy_fetch(*attrs) click to toggle source
# File lib/no_brainer/criteria/pluck.rb, line 15
def lazy_fetch(*attrs)
  _missing_attributes_criteria(:lazy_fetch, attrs)
end
pluck(*attrs) click to toggle source
# File lib/no_brainer/criteria/pluck.rb, line 7
def pluck(*attrs)
  _missing_attributes_criteria(:pluck, attrs)
end
without(*attrs) click to toggle source
# File lib/no_brainer/criteria/pluck.rb, line 11
def without(*attrs)
  _missing_attributes_criteria(:without, attrs)
end
without_plucking() click to toggle source
# File lib/no_brainer/criteria/pluck.rb, line 19
def without_plucking
  chain(:missing_attributes => :remove)
end

Private Instance Methods

_instantiate_model(attrs, options={}) click to toggle source
Calls superclass method
# File lib/no_brainer/criteria/pluck.rb, line 61
def _instantiate_model(attrs, options={})
  return super if @options[:missing_attributes].nil?
  super(attrs, options.merge(:missing_attributes => effective_missing_attributes,
                             :lazy_fetch => @options[:missing_attributes][:lazy_fetch]))
end
_missing_attributes_criteria(type, args) click to toggle source
# File lib/no_brainer/criteria/pluck.rb, line 37
def _missing_attributes_criteria(type, args)
  raise ArgumentError if args.size.zero?
  args = [Hash[args.flatten.map { |k| [k, true] }]] unless args.size == 1 && args.first.is_a?(Hash)
  chain(:missing_attributes => {type => args.first})
end
compile_rql_pass2() click to toggle source
Calls superclass method
# File lib/no_brainer/criteria/pluck.rb, line 67
def compile_rql_pass2
  rql = super
  if effective_missing_attributes
    type, attrs = effective_missing_attributes.first
    rql = rql.__send__(type, model.with_fields_aliased(attrs))
  end
  rql
end
effective_missing_attributes() click to toggle source
# File lib/no_brainer/criteria/pluck.rb, line 43
def effective_missing_attributes
  return nil if @options[:missing_attributes].nil?
  @effective_missing_attributes ||= begin
    # pluck gets priority
    missing_attributes = Hash[@options[:missing_attributes].map do |type, attrs|
      attrs = attrs.select { |k,v| v } # TODO recursive
      attrs.empty? ? nil : [type, attrs]
    end.compact]

    if missing_attributes[:pluck]
      { :pluck => missing_attributes[:pluck] }
    else
      attrs = [missing_attributes[:without], missing_attributes[:lazy_fetch]].compact.reduce(&:merge)
      { :without => attrs } if attrs.present?
    end
  end
end