Class: Hold::Sequel::PropertyMapper::Hash

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

Overview

A property which is a hash of strings to other 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) ⇒ Hash

Returns a new instance of Hash.



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

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"
  @key_column   = options[:key_column]   || :key
  @value_column = options[:value_column] || :value

  @dataset    = @repository.db[@table]
  @select_kv  = @repository.db[@table].select(
    Sequel.as(@key_column,:key),
    Sequel.as(@value_column,:value))
  @select_all = @repository.db[@table].select(
    Sequel.as(@key_column,:key),
    Sequel.as(@value_column,:value),
    Sequel.as(@foreign_key,:id))
end

Instance Attribute Details

#foreign_keyObject (readonly)

Returns the value of attribute foreign_key.



5
6
7
# File 'lib/hold/sequel/property_mapper/hash.rb', line 5

def foreign_key
  @foreign_key
end

#key_columnObject (readonly)

Returns the value of attribute key_column.



5
6
7
# File 'lib/hold/sequel/property_mapper/hash.rb', line 5

def key_column
  @key_column
end

#tableObject (readonly)

Returns the value of attribute table.



5
6
7
# File 'lib/hold/sequel/property_mapper/hash.rb', line 5

def table
  @table
end

#value_columnObject (readonly)

Returns the value of attribute value_column.



5
6
7
# File 'lib/hold/sequel/property_mapper/hash.rb', line 5

def value_column
  @value_column
end

Instance Method Details

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



25
26
27
28
29
30
31
# File 'lib/hold/sequel/property_mapper/hash.rb', line 25

def load_value(row=nil, id=nil, properties=nil)
  result = {}
  @select_kv.filter(@foreign_key => id).each do |row|
    result[row[:key]] = row[:value]
  end
  result
end

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



33
34
35
36
37
38
39
# File 'lib/hold/sequel/property_mapper/hash.rb', line 33

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[:key]] = row[:value]
  end
  result.values_at(*ids).each_with_index(&block)
end

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



45
46
47
48
49
50
# File 'lib/hold/sequel/property_mapper/hash.rb', line 45

def post_insert(entity, rows, last_insert_id=nil)
  hash = entity[@property_name] or return
  @dataset.multi_insert(hash.map do |k,v|
    {@foreign_key => last_insert_id, @key_column => k, @value_column => v}
  end)
end

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



52
53
54
55
56
57
58
# File 'lib/hold/sequel/property_mapper/hash.rb', line 52

def post_update(entity, update_entity, rows, data_from_pre_update)
  hash = update_entity[@property_name] or return
  @dataset.filter(@foreign_key => entity.id).delete
  @dataset.multi_insert(hash.map do |k,v|
    {@foreign_key => entity.id, @key_column => k, @value_column => v}
  end)
end

#pre_delete(entity) ⇒ Object



41
42
43
# File 'lib/hold/sequel/property_mapper/hash.rb', line 41

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