class ActiveScaffold::DataStructures::Columns

Attributes

active_record_class[R]

This accessor is used by ActionColumns to create new Column objects without adding them to this set

Public Class Methods

new(active_record_class, *args) click to toggle source
# File lib/active_scaffold/data_structures/columns.rb, line 22
def initialize(active_record_class, *args)
  @active_record_class = active_record_class
  @_inheritable = ::Set.new
  @set = {}
  @sorted = nil

  add(*args)
end

Public Instance Methods

<<(*args)
Alias for: add
[](name)
Alias for: find_by_name
_inheritable() click to toggle source
# File lib/active_scaffold/data_structures/columns.rb, line 84
def _inheritable
  if @sorted
    @_inheritable.to_a
  else
    @_inheritable.sort do |a, b|
      self[a] <=> self[b]
    end
  end
end
_inheritable=(value) click to toggle source

The motivation for this collection is that this Columns data structure fills two roles: it provides the master list of all known columns, and it provides an inheritable list for all other actions (e.g. Create and Update and List). Well we actually want to know about as many columns as possible, so we don’t want people actually removing columns from @set. But at the same time, we want to be able to manage which columns get inherited. Tada!

This collection is referenced by other parts of ActiveScaffold and by methods within this DataStructure. IT IS NOT MEANT FOR PUBLIC USE (but if you know what you’re doing, go ahead)

# File lib/active_scaffold/data_structures/columns.rb, line 14
def _inheritable=(value)
  @sorted = true
  @_inheritable = ::Set.new(value)
end
add(*args) click to toggle source

the way to add columns to the set. this is primarily useful for virtual columns. note that this also makes columns inheritable

# File lib/active_scaffold/data_structures/columns.rb, line 33
def add(*args)
  args.flatten! # allow [] as a param
  args = args.collect(&:to_sym)

  # make the columns inheritable
  @_inheritable.merge(args)
  # then add columns to @set (unless they already exist)
  args.each do |a|
    @set[a.to_sym] = ActiveScaffold::DataStructures::Column.new(a, @active_record_class) unless find_by_name(a)
  end
end
Also aliased as: <<
add_association_columns(association, *columns) click to toggle source

add columns from association (belongs_to or has_one) these columns will use label translation from association model they will be excluded, so won’t be included in action columns association columns will work for read actions only, not in form actions (create, update, subform)

# File lib/active_scaffold/data_structures/columns.rb, line 50
def add_association_columns(association, *columns)
  column = self[association]
  raise ArgumentError, "unknown column #{association}" if column.nil?
  raise ArgumentError, "column #{association} is not an association" if column.association.nil?
  raise ArgumentError, "column #{association} is not singular association" unless column.association.singular?
  raise ArgumentError, "column #{association} is polymorphic association" if column.association.polymorphic?

  klass = column.association.klass
  columns.each do |col|
    next if find_by_name col
    @set[col.to_sym] = ActiveScaffold::DataStructures::Column.new(col, klass, column.association)
  end
end
each() { |name| ... } click to toggle source
# File lib/active_scaffold/data_structures/columns.rb, line 80
def each
  @set.each_value { |name| yield name }
end
exclude(*args) click to toggle source
# File lib/active_scaffold/data_structures/columns.rb, line 64
def exclude(*args)
  # only remove columns from _inheritable. we never want to completely forget about a column.
  args.each { |a| @_inheritable.delete a.to_sym }
end
find_by_name(name) click to toggle source

returns the column of the given name.

# File lib/active_scaffold/data_structures/columns.rb, line 75
def find_by_name(name)
  @set[name.to_sym]
end
Also aliased as: []
find_by_names(*names) click to toggle source

returns an array of columns with the provided names

# File lib/active_scaffold/data_structures/columns.rb, line 70
def find_by_names(*names)
  names.map { |name| find_by_name name }
end