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

Raises:



65
66
67
68
69
70
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 65

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



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

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:

  • column names for the row model



48
49
50
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 48

def dynamic_column_names
  dynamic_columns.keys
end

.dynamic_column_options(column_name) ⇒ Object



43
44
45
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 43

def dynamic_column_options(column_name)
  dynamic_columns[column_name]
end

.dynamic_columns?Boolean

Returns:



15
16
17
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 15

def dynamic_columns?
  dynamic_columns.present?
end

.dynamic_index(column_name) ⇒ Integer

Returns index of dynamic_column of all columns.

Returns:

  • index of dynamic_column of all columns



38
39
40
41
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 38

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



24
25
26
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 24

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

.is_dynamic_column?(column_name) ⇒ Boolean

Returns:



19
20
21
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 19

def is_dynamic_column?(column_name)
  dynamic_columns.keys.include?(column_name)
end

.singular_dynamic_attribute_method_name(column_name) ⇒ Object



52
53
54
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 52

def singular_dynamic_attribute_method_name(column_name)
  column_name.to_s.singularize
end

Instance Method Details

#attributesObject

See Model::Columns#attributes



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

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