Class: Arxutils::HierOp
- Inherits:
-
Object
- Object
- Arxutils::HierOp
- Defined in:
- lib/arxutils/hier.rb
Instance Method Summary collapse
- #delete(hier) ⇒ Object
-
#initialize(hier_symbol, base_klass, hier_klass, current_klass) ⇒ HierOp
constructor
A new instance of HierOp.
- #move(src_hier, dest_parent_hier) ⇒ Object
- #register(hier) ⇒ Object
- #register_parent(hier_ary, child_num, level) ⇒ Object
Constructor Details
#initialize(hier_symbol, base_klass, hier_klass, current_klass) ⇒ HierOp
Returns a new instance of HierOp.
5 6 7 8 9 10 |
# File 'lib/arxutils/hier.rb', line 5 def initialize( hier_symbol , base_klass , hier_klass , current_klass ) @hier_symbol = hier_symbol @base_klass = base_klass @hier_klass = hier_klass @current_klass = current_klass end |
Instance Method Details
#delete(hier) ⇒ Object
12 13 14 15 16 17 18 19 20 21 |
# File 'lib/arxutils/hier.rb', line 12 def delete( hier ) # 子として探す id = nil row_item = @base_klass.find_by( { @hier_symbol => hier } ) if row_item id = row_item.id delete_at( id ) end id end |
#move(src_hier, dest_parent_hier) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/arxutils/hier.rb', line 23 def move( src_hier , dest_parent_hier ) # dest_parent_hierがsrc_hierの子であれば(=src_hierがdest_parent_hierの先頭からの部分文字列である)何もせずエラーを返す escaped = Regexp.escape( src_hier ) src_re = Regexp.new( %Q!^#{escaped}! ) ret = ( src_re =~ dest_parent_hier ) # 自身の子への移動はエラーとする if ret return false end src_row_item = @base_klass.where( name: src_hier ) src_num = src_row_item.id # srcが子である(tblでは項目を一意に指定できる)のtblでの項目を得る src_row = @hire_klass.find_by( child_id: src_num ) dest_parent_row_item = @base_klass.find_by( name: dest_parent_hier ) unless dest_parent_row_item dest_parent_num = register( dest_parent_hier ) else dest_parent_num = dest_parent_row_item.id end dest_parent_level = get_level_by_child( dest_parent_num ) # srcの親をdest_parentにする src_row.parent_id = dest_parent_num # destに移動後のsrcの子のレベルを調整する level_adjust( src_row , dest_parent_level ) # destに移動後のsrcのhierを再設定 set_hier( src_row_item , make_hier( dest_parent_row_item.name , get_name( src_row_item ) ) ) # destに移動後のsrcの子のhierを調整する hier_adjust( src_row_item ) true end |
#register(hier) ⇒ Object
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/arxutils/hier.rb', line 68 def register( hier ) hier_ary = hier.split('/') level = get_level_by_array( hier_ary ) # もしhier_aryがnilだけを1個持つ配列、または空文字列だけを1個もつ配列であれば、hier_nameは空文字列になる item_row = @current_klass.find_by( {@hier_symbol => hier} ) unless item_row # @base_klassがhierだけでcreateできる場合は(他にフィールドがnot_nullでないか)、ここに来てもよい。 # そうでなければ、SQLの制約違反が発生するため、ここに来ることを避けなければならない。 # (あらかじめここが呼ばれないようにdatabaseに登録済みにしておかなければならない。) new_category = @base_klass.create( {@hier_symbol => hier} ) new_num = new_category.id if level == 0 unless @hier_klass.find_by( child_id: new_num ) hs = { parent_id: new_num , child_id: new_num , level: level } @hier_klass.create( hs ) end else register_parent( hier_ary , new_num, level ) end else new_num = item_row.org_id if level == 0 unless @hier_klass.find_by( child_id: new_num ) hs = {parent_id: new_num , child_id: new_num , level: level} @hier_klass.create( hs ) end else unless @hier_klass.find_by( child_id: new_num ) register_parent( hier_ary , new_num, level ) end end end new_num end |
#register_parent(hier_ary, child_num, level) ⇒ Object
59 60 61 62 63 64 65 66 |
# File 'lib/arxutils/hier.rb', line 59 def register_parent( hier_ary , child_num , level ) hier_ary.pop parent_hier_ary = hier_ary parent_hier = parent_hier_ary.join('/') parent_num = register( parent_hier ) hs = { parent_id: parent_num , child_id: child_num , level: level } @hier_klass.create( hs ) end |