Recursive problem


#1

Hi everybody,
I was trying to create a rake task to import geo data by accessing
geonmae API’s xml data , I wanna create a list of countries , cities ,
sub cities that r related to each other through nested list , anyways, I
have a problem with the recursion i made , i didn’t get it , I’ll list
the code hopefully i will get some help from any expert here around ,
Any help will b highly appreciated .


require File.dirname(FILE) + ‘/…/config/boot’
require “#{RAILS_ROOT}/config/environment”
conf = YAML::load(File.open(File.dirname(FILE) +
‘/…/config/database.yml’))
ActiveRecord::Base.establish_connection(conf[‘development’])

module Geonames

    @@langs={}
    Language.all.each{|Lan| @@langs[Lan.iso_639_1] = Lan.id}
    @@continent = {'AF' => 6255146}#, 'AS' => 6255147, 'EU' =>

6255148, ‘NA’ => 6255149 , ‘OC’ => 6255151,‘SA’ => 6255150,‘AN’ =>
6255152}

    def self.import
       puts "lets start the game"
       self.import_continents
       self.import_countries_and_sub
    end


    def self.import_continents
          puts '*** add globe to tables'
          self.add_new_tag({:tag_type =>1,:status => 0, :user_id =>

666666},{:content => ‘Globe’, :language =>@@langs[‘en’], :primary =>
true},{})

          puts '*** add continent  tables'
          @@continent.each_key{|x,y| self.add_new_tag({:tag_type

=>1,:status => 0, :user_id => 666666, :sub_type =>0},{:content => x,
:language =>@@langs[‘en’], :primary =>true}, {:parent_id =>
Region.find_by_word_name(‘Globe’).id} )}
end

    def self.import_countries_and_sub

        @@continent.each do |cont_name,cont_geo_id|
           puts "importing countiries in #{cont_name} continents"
           @@cont_id = Region.find_by_name(cont_name)
           self.do_nasty_stuff(cont_geo_id, @@cont_id, 1)
        end

    end



 def self.add_new_tag(tag_options={}, word_options={},

region_options={}, alt={})
# not gonna list all the code since u don’t have all the time to
read it :slight_smile: anyways this function for adding the geo as a tag and save it
with different language and different spelling as non primary words for
this tag

    end

    def self.do_nasty_stuff(geo_id, prt_id, sub_type)
      # the xml data of that data given by geo id number
      @@baba_xml =

Hpricot.parse(open(“http://ws.geonames.org/children?geonameId=#{geo_id}&style=full”))
p “*********************** importing xml of #{geo_id}
*********************”

         (@@baba_xml/:geoname).each do |thing|

            lat = CGI.escapeHTML(thing.at(:lat).children.first.to_s)
            lng = CGI.escapeHTML(thing.at(:lng).children.first.to_s)

            # add the main country
            extra_info = {:lat => lat, :lng => lng }

            # add the sub alternative names as non primary words
            alt_hash = Hash.new
            thing.search(:alternatename).each do |alt|
              alt_hash[alt.children.first.to_s] =

@@langs[alt[:lang]]
end

            # forget about the parameters here , it has nothing with

the problem
self.add_new_tag({:tag_type =>1,:status => 0, :user_id
=> 666666, :sub_type =>sub_type},{:content => name, :language
=>@@langs[‘en’], :primary =>true}, {:parent_id => prt_id, :data =>
extra_info} ,alt_hash)
# HERE IS WHERE I NEED UR HELP
if ((sub_type.to_i < 3))
prt_id = Region.find_by_word_name(name)
geo_id =
CGI.escapeHTML(thing.at(:geonameid).children.first.to_s)
p " do nasty stuff #{geo_id} #{prt_id} , #{sub_type}"
self.do_nasty_stuff(geo_id, prt_id, sub_type + 1)
end

         end

      end

end


in do_nasty_stuff -> if ((sub_type.to_i < 2)) , I don’t know why but
the returning data is not accurate , as 4 example , in Africa , the
first loop in working perfectly but then it will list Angola for example
as child of the previous country (algeria) …

Thnx