module ActiveScaffold::Helpers::AssociationHelpers

Public Instance Methods

association_klass_scoped(association, klass, record) click to toggle source
# File lib/active_scaffold/helpers/association_helpers.rb, line 61
def association_klass_scoped(association, klass, record)
  if nested? && nested.through_association? && nested.child_association.try(:through_reflection) == association
    if nested.association.through_reflection.collection?
      nested_parent_record.send(nested.association.through_reflection.name)
    else
      klass.where(association.association_primary_key => nested_parent_record.send(nested.association.through_reflection.name).try(:id))
    end
  else
    klass
  end
end
association_options_count(association, conditions = nil) click to toggle source
# File lib/active_scaffold/helpers/association_helpers.rb, line 84
def association_options_count(association, conditions = nil)
  association.klass.where(conditions).where(association.options[:conditions]).count
end
association_options_find(association, conditions = nil, klass = nil, record = nil) { |relation| ... } click to toggle source

Provides a way to honor the :conditions on an association while searching the association's klass

# File lib/active_scaffold/helpers/association_helpers.rb, line 16
def association_options_find(association, conditions = nil, klass = nil, record = nil)
  ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, call with record.', caller if record.nil? # TODO: Remove when relying on @record is removed
  record ||= @record # TODO: Remove when relying on @record is removed
  if klass.nil? && association.options[:polymorphic]
    class_name = record.send(association.foreign_type)
    if class_name.present?
      klass = class_name.constantize
    else
      return []
    end
    cache = !block_given?
  else
    cache = !block_given? && klass.nil?
    klass ||= association.klass
  end

  if conditions.nil?
    if method(:options_for_association_conditions).arity.abs == 2
      conditions = options_for_association_conditions(association, record)
    else
      ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include record in your options_for_association_conditions overrided method.', caller if record.nil? # TODO: Remove when relying on @record is removed
      conditions = options_for_association_conditions(association)
    end
  end
  cache_association_options(association, conditions, klass, cache) do
    klass = association_klass_scoped(association, klass, record)
    relation = klass.where(conditions).where(association.options[:conditions])
    relation = relation.includes(association.options[:include]) if association.options[:include]
    column = column_for_association(association, record)
    if column && column.try(:sort) && column.sort[:sql]
      if column.includes
        include_assoc = column.includes.find { |assoc| assoc.is_a?(Hash) && assoc.include?(association.name) }
        relation = relation.includes(include_assoc[association.name]) if include_assoc
      end
      relation = relation.order(column.sort[:sql])
    end
    relation = yield(relation) if block_given?
    relation.to_a
  end
end
cache_association_options(association, conditions, klass, cache = true) { || ... } click to toggle source

Cache the options for select

# File lib/active_scaffold/helpers/association_helpers.rb, line 5
def cache_association_options(association, conditions, klass, cache = true)
  if active_scaffold_config.cache_association_options && cache
    @_associations_cache ||= Hash.new { |h, k| h[k] = {} }
    key = [association.name, association.active_record.name, klass.name].join('/')
    @_associations_cache[key][conditions] ||= yield
  else
    yield
  end
end
column_for_association(association, record) click to toggle source
# File lib/active_scaffold/helpers/association_helpers.rb, line 57
def column_for_association(association, record)
  active_scaffold_config_for(record.class).columns[association.name] rescue nil
end
options_for_association_conditions(association, record = nil) click to toggle source

A useful override for customizing the records present in an association dropdown. Should work in both the subform and form_ui=>:select modes. Check association.name to specialize the conditions per-column.

# File lib/active_scaffold/helpers/association_helpers.rb, line 101
def options_for_association_conditions(association, record = nil)
  return nil if association.options[:through]
  case association.macro
    when :has_one, :has_many
      # Find only orphaned objects
      {association.foreign_key => nil}
    when :belongs_to, :has_and_belongs_to_many
      # Find all
      nil
  end
end
options_for_association_count(association, record) click to toggle source
# File lib/active_scaffold/helpers/association_helpers.rb, line 88
def options_for_association_count(association, record)
  if method(:options_for_association_conditions).arity.abs == 2
    conditions = options_for_association_conditions(association, record)
  else
    ActiveSupport::Deprecation.warn 'Relying on @record is deprecated, include record in your options_for_association_conditions overrided method.', caller if record.nil? # TODO: Remove when relying on @record is removed
    conditions = options_for_association_conditions(association)
  end
  association_options_count(association, conditions)
end
record_select_params_for_add_existing(association, edit_associated_url_options, record) click to toggle source
# File lib/active_scaffold/helpers/association_helpers.rb, line 113
def record_select_params_for_add_existing(association, edit_associated_url_options, record)
  {:onselect => "ActiveScaffold.record_select_onselect(#{url_for(edit_associated_url_options).to_json}, #{active_scaffold_id.to_json}, id);"}
end
sorted_association_options_find(association, conditions = nil, record = nil) click to toggle source

Sorts the options for select

# File lib/active_scaffold/helpers/association_helpers.rb, line 74
def sorted_association_options_find(association, conditions = nil, record = nil)
  options = association_options_find(association, conditions, nil, record)
  column = column_for_association(association, record)
  unless column && column.try(:sort) && column.sort[:sql]
    method = column.options[:label_method] if column
    options = options.sort_by(&(method || :to_label).to_sym)
  end
  options
end