Class: WorldDb::Model::Region

Inherits:
ActiveRecord::Base
  • Object
show all
Extended by:
TextUtils::TagHelper, TextUtils::ValueHelper
Defined in:
lib/worlddb/models/region_comp.rb,
lib/worlddb/models/region.rb,
lib/worlddb/models/forward.rb

Overview

collect depreciated or methods for future removal here

- keep for now for commpatibility (for old code)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.create_or_update_from_attribs(new_attributes, values, opts = {}) ⇒ Object



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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# File 'lib/worlddb/models/region.rb', line 69

def self.create_or_update_from_attribs( new_attributes, values, opts={} )

  ## opts e.g. :skip_tags true|false

  ## fix: add/configure logger for ActiveRecord!!!
  logger = LogKernel::Logger.root

  value_numbers     = []
  value_tag_keys    = []
  value_cities      = []

  ### check for "default" tags - that is, if present new_attributes[:tags] remove from hash
  value_tag_keys += find_tags_in_attribs!( new_attributes )

  ## check for optional values
  values.each_with_index do |value,index|
    if match_country( value ) do |country| # country:
         new_attributes[ :country_id ] = country.id
       end
    elsif match_km_squared( value ) do |num| # allow numbers like 453 kmĀ²
            value_numbers << num
          end
    elsif match_number( value ) do |num|  # numeric (nb: can use any _ or spaces inside digits e.g. 1_000_000 or 1 000 000)
            value_numbers << num
          end
    elsif value =~ /^[A-Z]{2,3}$/  ## assume two or three-letter code
      new_attributes[ :code ] = value
    elsif (values.size==(index+1)) && is_taglist?( value )   # tags must be last entry
      logger.debug "   found tags: >>#{value}<<"
      value_tag_keys += find_tags( value )
    else
        
      ### assume it is the capital city - mark it for auto add
      value_cities << value
      next
 
      # issue warning: unknown type for value
      # logger.warn "unknown type for value >#{value}<"
    end
  end # each value

  if value_numbers.size > 0
    new_attributes[ :area ] = value_numbers[0]
    new_attributes[ :pop  ] = value_numbers[1]
  end  # if value_numbers.size > 0

  ## todo: assert that country_id is present/valid, that is, NOT null
  rec = Region.find_by_key_and_country_id( new_attributes[ :key ], new_attributes[ :country_id] )

  if rec.present?
    logger.debug "update Region #{rec.id}-#{rec.key}:"
  else
    logger.debug "create Region:"
    rec = Region.new
  end
    
  logger.debug new_attributes.to_json
 
  rec.update_attributes!( new_attributes )

  #################
  # auto add capital cities

  City.create_or_update_from_titles( value_cities,
                                          region_id:  rec.id,
                                          country_id: rec.country_id )

  ### todo/fix: add captial ref to country/region
  ## todo/fix: use update_from_title and only allow one capital city


  ##################
  # add taggings 

  ## todo/fix: reuse - move add taggings into method etc.

    if value_tag_keys.size > 0
      
      if opts[:skip_tags].present?
        logger.debug "   skipping add taggings (flag skip_tag)"
      else
        value_tag_keys.uniq!  # remove duplicates
        logger.debug "   adding #{value_tag_keys.size} taggings: >>#{value_tag_keys.join('|')}<<..."

        ### fix/todo: check tag_ids and only update diff (add/remove ids)

        value_tag_keys.each do |key|
          tag = Tag.find_by_key( key )
          if tag.nil?  # create tag if it doesn't exit
            logger.debug "   creating tag >#{key}<"
            tag = Tag.create!( key: key )
          end
          rec.tags << tag
        end
      end
    end

  rec

end

.create_or_update_from_values(values, more_attribs = {}) ⇒ Object



58
59
60
61
62
63
64
65
66
# File 'lib/worlddb/models/region.rb', line 58

def self.create_or_update_from_values( values, more_attribs={} )

  ## key & title & country required
  attribs, more_values = find_key_n_title( values )
  attribs = attribs.merge( more_attribs )

  ## check for optional values
  Region.create_or_update_from_attribs( attribs, more_values )
end

Instance Method Details

#all_names(opts = {}) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/worlddb/models/region.rb', line 43

def all_names( opts={} )
  ### fix:
  ## allow to passing in sep or separator e.g. | or other

  return name if alt_names.blank?
  
  buf = ''
  buf << name
  buf << ' | '
  buf << alt_names.split('|').join(' | ')
  buf
end

#on_createObject



28
29
30
31
# File 'lib/worlddb/models/region.rb', line 28

def on_create
  place_rec = Place.create!( name: name, kind: place_kind )
  self.place_id = place_rec.id 
end

#on_updateObject



33
34
35
36
# File 'lib/worlddb/models/region.rb', line 33

def on_update
  ## fix/todo: check - if name or kind changed - only update if changed ?? why? why not??
  place.update_attributes!( name: name, kind: place_kind )
end

#place_kindObject

use place_kind_of_code ??



38
39
40
# File 'lib/worlddb/models/region.rb', line 38

def place_kind   # use place_kind_of_code ??
  'ADM1'
end

#synonymsObject



17
# File 'lib/worlddb/models/region_comp.rb', line 17

def synonyms()       alt_names;      end

#synonyms=(value) ⇒ Object



18
# File 'lib/worlddb/models/region_comp.rb', line 18

def synonyms=(value) self.alt_names = value; end

#titleObject



12
# File 'lib/worlddb/models/region_comp.rb', line 12

def title()       name;              end

#title=(value) ⇒ Object



13
# File 'lib/worlddb/models/region_comp.rb', line 13

def title=(value) self.name = value; end

#title_w_synonyms(opts = {}) ⇒ Object

depreciated: use all_names instead



20
# File 'lib/worlddb/models/region_comp.rb', line 20

def title_w_synonyms( opts={} )  all_names( opts );  end