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)


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

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



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

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



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

def dynamic_column_names
  dynamic_columns.keys
end

.dynamic_column_options(column_name) ⇒ Object



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

def dynamic_column_options(column_name)
  dynamic_columns[column_name]
end

.dynamic_columns?Boolean

Returns:



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

def dynamic_columns?
  dynamic_columns.present?
end

.dynamic_index(column_name) ⇒ Integer

Returns index of dynamic_column of all columns.

Returns:

  • (Integer)

    index of dynamic_column of all columns



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

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



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

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

.is_dynamic_column?(column_name) ⇒ Boolean

Returns:



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

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

.singular_dynamic_attribute_method_name(column_name) ⇒ Object



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

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