Class: Hold::Sequel::PropertyMapper::Array

Inherits:
Hold::Sequel::PropertyMapper show all
Defined in:
lib/hold/sequel/property_mapper/array.rb

Overview

A property which is an array of primitive values. Persisted ‘all in one go’ in a separate table.

Instance Attribute Summary collapse

Attributes inherited from Hold::Sequel::PropertyMapper

#property, #property_name, #repository

Instance Method Summary collapse

Methods inherited from Hold::Sequel::PropertyMapper

#build_insert_row, #build_update_row, #columns_aliases_and_tables_for_select, #make_filter, #make_multi_filter, #post_delete, #pre_insert, #pre_update, setter_dependencies_for

Constructor Details

#initialize(repo, property_name, options) ⇒ Array

Returns a new instance of Array.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/hold/sequel/property_mapper/array.rb', line 6

def initialize(repo, property_name, options)
  super(repo, property_name)

  @table        = options[:table]        || :"#{repo.main_table}_#{property_name}"
  @foreign_key  = options[:foreign_key]  || :"#{repo.main_table.to_s.singularize}_id"
  @value_column = options[:value_column] || :value
  @order_column = options[:order_column]

  @dataset    = @repository.db[@table]
  @select_v   = @repository.db[@table].select(Sequel.as(@value_column,:value))
  @select_v   = @select_v.order(@order_column) if @order_column
  @select_all = @repository.db[@table].select(
    Sequel.as(@value_column,:value),
    Sequel.as(@foreign_key,:id))
  @select_all = @select_all.order(@order_column) if @order_column
end

Instance Attribute Details

#foreign_keyObject (readonly)

Returns the value of attribute foreign_key.



4
5
6
# File 'lib/hold/sequel/property_mapper/array.rb', line 4

def foreign_key
  @foreign_key
end

#tableObject (readonly)

Returns the value of attribute table.



4
5
6
# File 'lib/hold/sequel/property_mapper/array.rb', line 4

def table
  @table
end

#value_columnObject (readonly)

Returns the value of attribute value_column.



4
5
6
# File 'lib/hold/sequel/property_mapper/array.rb', line 4

def value_column
  @value_column
end

Instance Method Details

#load_value(row = nil, id = nil, properties = nil) ⇒ Object



23
24
25
# File 'lib/hold/sequel/property_mapper/array.rb', line 23

def load_value(row=nil, id=nil, properties=nil)
  @select_v.filter(@foreign_key => id).map {|row| row[:value]}
end

#load_values(rows = nil, ids = nil, properties = nil, &block) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/hold/sequel/property_mapper/array.rb', line 27

def load_values(rows=nil, ids=nil, properties=nil, &block)
  results = Hash.new {|h,k| h[k]=[]}
  @select_all.filter(@foreign_key => ids).each do |row|
    results[row[:id]] << row[:value]
  end
  result.values_at(*ids).each_with_index(&block)
end

#post_insert(entity, rows, last_insert_id = nil) ⇒ Object



39
40
41
42
43
44
45
46
47
48
# File 'lib/hold/sequel/property_mapper/array.rb', line 39

def post_insert(entity, rows, last_insert_id=nil)
  array = entity[@property_name] or return
  insert_rows = []
  array.each_with_index do |v,i|
    row = {@foreign_key => entity.id || last_insert_id, @value_column => v}
    row[@order_column] = i if @order_column
    insert_rows << row
  end
  @dataset.multi_insert(insert_rows)
end

#post_update(entity, update_entity, rows, data_from_pre_update) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/hold/sequel/property_mapper/array.rb', line 50

def post_update(entity, update_entity, rows, data_from_pre_update)
  array = update_entity[@property_name] or return
  @dataset.filter(@foreign_key => entity.id).delete
  insert_rows = []
  array.each_with_index do |v,i|
    row = {@foreign_key => entity.id, @value_column => v}
    row[@order_column] = i if @order_column
    insert_rows << row
  end
  @dataset.multi_insert(insert_rows)
end

#pre_delete(entity) ⇒ Object



35
36
37
# File 'lib/hold/sequel/property_mapper/array.rb', line 35

def pre_delete(entity)
  @dataset.filter(@foreign_key => entity.id).delete
end