module DelegateAssociations

Constants

VERSION

Public Instance Methods

delegate_associations(*opts) click to toggle source
# File lib/delegate_associations.rb, line 7
def delegate_associations(*opts)
        options = {
                except: [], only: [], allow_nil: false, to: []
        }
        options.update(opts.extract_options!)
        associations = [options.delete(:to)].flatten.compact.map!(&:to_sym)
        valid_associations_to(associations)

        except = [options[:except]].flatten.compact.map!(&:to_sym)
        only  = [options[:only]].flatten.compact.map!(&:to_sym)
        except += delegate_exclude_columns

        associations.each do |association|
                reflect_on_association(association).klass.reflect_on_all_associations.each do |ass|
                        next unless ass.name.in?(get_deletage_methods(reflect_on_association(association).klass.reflect_on_all_associations.map(&:name), except, only))
                        delegate "#{ass.name}",  to: association, allow_nil: options[:allow_nil]
                        delegate "#{ass.name}=", to: association, allow_nil: options[:allow_nil]
                        begin 
                                delegate "#{ass.name}_attributes=", to: association, allow_nil: options[:allow_nil]
                        rescue
                                true
                        end
                        
                        unless ass.collection?
                                delegate "build_#{ass.name}", to: association
                        end
                end
        end
end
delegate_attributes(*opts) click to toggle source
# File lib/delegate_associations.rb, line 37
def delegate_attributes(*opts)
        options = {
                suffix: ["","=","?","_before_type_cast","_change","_changed?","_was","_will_change!"], 
                except: [], only: [], allow_nil: false, to: [], prefix: nil
        }
        options.update(opts.extract_options!)
        associations = [options.delete(:to)].flatten.compact.map!(&:to_sym)

        #Valid if have an option[:to] and if association exists
        valid_associations_to(associations)

        except  = [options[:except]].flatten.compact.map!(&:to_sym)
        only    = [options[:only]].flatten.compact.map!(&:to_sym)
        prefix  = options[:prefix]
        except += delegate_exclude_columns
        
        # I need "begin" because have a problem with Devise when I run migrations
        # Devise call User classs before run all migrations
        begin
                associations.each do |association|
                        get_deletage_methods(reflect_on_association(association).klass.column_names, except, only).each do |attribute| 
                                options[:suffix].each do |sf|
                                        delegate "#{attribute}#{sf}", to: association, allow_nil: options[:allow_nil], prefix: prefix
                                end
                        end
                end
        rescue
                true
        end
end

Private Instance Methods

delegate_exclude_columns() click to toggle source
# File lib/delegate_associations.rb, line 82
def delegate_exclude_columns
        [:id, :created_at, :updated_at]
end
get_deletage_methods(all_options, except, only) click to toggle source
# File lib/delegate_associations.rb, line 70
def get_deletage_methods(all_options, except, only)
        return (all_options.map(&:to_sym)&only)-delegate_exclude_columns if only.any?
        all_options.map(&:to_sym) - except
end
valid_associations_to(associations) click to toggle source
# File lib/delegate_associations.rb, line 75
def valid_associations_to(associations)
        raise ":to options can't be blank!" if associations.blank?
        associations.each do |association|
                raise "#{name} don't have the association #{association}" unless reflect_on_association(association)
        end
end