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 =
[].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.define_header_method(column_name) ⇒ Object (protected)



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

def define_header_method(column_name)
  define_singleton_method(header_method_name(column_name)) { |header_model| header_model }
end

.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)


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

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

  define_header_method(column_name)

  merge_dynamic_columns(column_name.to_sym => options)
end

.dynamic_column_namesArray<Symbol>

Returns column names for the row model.

Returns:

  • (Array<Symbol>)

    column names for the row model



28
29
30
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 28

def dynamic_column_names
  dynamic_columns.keys
end

.dynamic_columnsHash

Returns column names mapped to their options.

Returns:

  • (Hash)

    column names mapped to their options



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

def dynamic_columns
  inherited_class_var(:@_dynamic_columns, {}, :merge)
end

.dynamic_index(column_name) ⇒ Integer

Returns index of dynamic_column of all columns.

Returns:

  • (Integer)

    index of dynamic_column of all columns



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

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

.header_method_name(column_name) ⇒ Object



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

def header_method_name(column_name)
  "#{column_name.to_s.singularize}_header"
end

.headers(context = {}) ⇒ Object

See Model::Columns::headers



13
14
15
16
17
18
19
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 13

def headers(context={})
  @headers ||= super + dynamic_column_names.map do |column_name|
    OpenStruct.new(context).public_send(column_name).each do |header_model|
      public_send(header_method_name(column_name), header_model)
    end
  end.flatten
end

.merge_dynamic_columns(column_hash) ⇒ Object (protected)



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

def merge_dynamic_columns(column_hash)
  @_dynamic_columns ||= {}
  deep_clear_class_cache(:@_dynamic_columns)
  @_dynamic_columns.merge!(column_hash)
end

.singular_dynamic_attribute_method_name(column_name) ⇒ Object



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

def singular_dynamic_attribute_method_name(column_name)
  column_name.to_s.singularize
end

Instance Method Details

#attributesObject

See Model::Columns#attributes



7
8
9
# File 'lib/csv_row_model/model/dynamic_columns.rb', line 7

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