Module: EagerGroup::ClassMethods

Defined in:
lib/eager_group.rb

Instance Method Summary collapse

Instance Method Details

#define_eager_group(attr, association, aggregate_function, column_name, scope = nil) ⇒ Object

class Post

define_eager_group :comments_avergage_rating, :comments, :average, :rating
define_eager_group :approved_comments_count, :comments, :count, :*, -> { approved }

end



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/eager_group.rb', line 21

def define_eager_group(attr, association, aggregate_function, column_name, scope = nil)
  send :attr_accessor, attr
  eager_group_definitions[attr] = Definition.new(association, aggregate_function, column_name, scope)

  define_method attr,
                lambda { |*args|
                  query_result_cache = instance_variable_get("@#{attr}")
                  return query_result_cache if args.blank? && query_result_cache.present?

                  preload_eager_group(attr, *args)
                  instance_variable_get("@#{attr}")
                }

  define_method "#{attr}=" do |val|
    instance_variable_set("@#{attr}", val)
  end
end