module ActiveJax module ActiveRecord module Ext def self.included(base) base.extend(ClassMethods) end def _active_jax_attributes instance_attributes = self.attributes self.class.active_jax_options[:exclude_columns].each { |col| instance_attributes.delete(col.to_s) } self.class.active_jax_options[:include].each do |send_include| if !self.class.active_jax_options[:exclude_columns].include?(send_include) included = self.send(send_include) instance_attributes[send_include] = included._active_jax_attributes end end instance_attributes end module ClassMethods @@active_jax_meta = {} def _add_active_jax_meta(finders, options) @@active_jax_meta ||= {} @@active_jax_meta[self] = {:class => self, :finders => finders, :options => options} end def _active_jax_meta() @@active_jax_meta.values.each do |ajc| if ajc[:finders].empty? ajc[:finders] = ajc[:class].public_methods.select { |m| m.match(/\Afind/) }.reject { |m| ajc[:class].superclass.respond_to?(m) && !m.match(/\Afind\Z/) && !m.match(/\Afind_all\Z/) } end end @@active_jax_meta end def active_jax_finders _active_jax_meta[self][:finders] end def active_jax_options _active_jax_meta[self][:options] end def active_jaxed? !@@active_jax_meta[self].nil? end def active_jax(*args) @@active_jax_meta ||= {} options = {:exclude_columns => [], :include => []} if args if args[-1].is_a?(Hash) passed_options = args.pop passed_options[:exclude_columns] = [passed_options[:exclude_columns]] if passed_options[:exclude_columns].is_a?(String) || passed_options[:exclude_columns].is_a?(Symbol) passed_options[:exclude_columns] = passed_options[:exclude_columns].collect { |col| col.to_s } if passed_options[:exclude_columns] passed_options[:include] = [passed_options[:include]] if passed_options[:include].is_a?(String) || passed_options[:include].is_a?(Symbol) passed_options[:include] = passed_options[:include].collect { |col| col.to_s } if passed_options[:include] options = options.merge(passed_options) end end finders = [] if !args.nil? && args.length > 0 finders = args.collect { |f| f.to_s } end self._add_active_jax_meta(finders, options) end end end end end