Class: Hold::Sequel::PropertyMapper::Hash
- Inherits:
-
Hold::Sequel::PropertyMapper
- Object
- Hold::Sequel::PropertyMapper
- Hold::Sequel::PropertyMapper::Hash
- 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
-
#foreign_key ⇒ Object
readonly
Returns the value of attribute foreign_key.
-
#key_column ⇒ Object
readonly
Returns the value of attribute key_column.
-
#table ⇒ Object
readonly
Returns the value of attribute table.
-
#value_column ⇒ Object
readonly
Returns the value of attribute value_column.
Attributes inherited from Hold::Sequel::PropertyMapper
#property, #property_name, #repository
Instance Method Summary collapse
-
#initialize(repo, property_name, options) ⇒ Hash
constructor
A new instance of Hash.
- #load_value(row = nil, id = nil, properties = nil) ⇒ Object
- #load_values(rows = nil, ids = nil, properties = nil, &block) ⇒ Object
- #post_insert(entity, rows, last_insert_id = nil) ⇒ Object
- #post_update(entity, update_entity, rows, data_from_pre_update) ⇒ Object
- #pre_delete(entity) ⇒ Object
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, ) super(repo, property_name) @table = [:table] || :"#{repo.main_table}_#{property_name}" @foreign_key = [:foreign_key] || :"#{repo.main_table.to_s.singularize}_id" @key_column = [:key_column] || :key @value_column = [: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_key ⇒ Object (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_column ⇒ Object (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 |
#table ⇒ Object (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_column ⇒ Object (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 |