Module: CsvRowModel::Model::DynamicColumns

Extended by:
ActiveSupport::Concern
Included in:
CsvRowModel::Model
Defined in:
lib/csv_row_model/model/dynamic_columns.rb

Constant Summary collapse

VALID_OPTIONS_KEYS =
%i[header].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.dynamic_column(column_name, options = {}) ⇒ Object (protected)

define a dynamic_column, must be after all normal columns

options to be implemented later

Parameters:

  • column_name (Symbol)

    column_name

Raises:

  • (ArgumentError)


58
59
60
61
62
63
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 58

def dynamic_column(column_name, options={})
  extra_keys = options.keys - VALID_OPTIONS_KEYS
  raise ArgumentError.new("invalid options #{extra_keys}") unless extra_keys.empty?

  merge_dynamic_columns(column_name.to_sym => options)
end

.dynamic_column_headers(context = {}) ⇒ Object



21
22
23
24
25
26
27
28
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 21

def dynamic_column_headers(context={})
  dynamic_column_names.map do |column_name|
    Array(OpenStruct.new(context).public_send(column_name)).each do |header_model|
      header_proc = dynamic_column_options(column_name)[:header] || ->(header_model) { header_model }
      instance_exec(header_model, &header_proc)
    end
  end.flatten
end

.dynamic_column_namesArray<Symbol>

Returns column names for the row model.

Returns:

  • (Array<Symbol>)

    column names for the row model



41
42
43
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 41

def dynamic_column_names
  dynamic_columns.keys
end

.dynamic_column_options(column_name) ⇒ Object



36
37
38
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 36

def dynamic_column_options(column_name)
  dynamic_columns[column_name]
end

.dynamic_index(column_name) ⇒ Integer

Returns index of dynamic_column of all columns.

Returns:

  • (Integer)

    index of dynamic_column of all columns



31
32
33
34
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 31

def dynamic_index(column_name)
  offset = dynamic_column_names.index(column_name)
  offset ? columns.size + offset : nil
end

.headers(context = {}) ⇒ Object

See Model::Columns::headers



17
18
19
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 17

def headers(context={})
  super + dynamic_column_headers(context)
end

.singular_dynamic_attribute_method_name(column_name) ⇒ Object



45
46
47
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 45

def singular_dynamic_attribute_method_name(column_name)
  column_name.to_s.singularize
end

Instance Method Details

#attributesObject

See Model::Columns#attributes



11
12
13
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 11

def attributes
  super.merge(attributes_from_column_names(self.class.dynamic_column_names))
end