Class: JpAddress::Zipcode

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/jp_address/zipcode.rb

Constant Summary collapse

MASTER_CSV_PATH =
'tmp/ken_all.csv'

Class Method Summary collapse

Class Method Details

._find_shared_name_from(names) ⇒ Object

引数に渡された地名群から、先頭から見て共通となる地名を返します。

input = %w[鳴子温泉小身川

   鳴子温泉川袋
   鳴子温泉木戸脇
]

return => 鳴子温泉



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
# File 'app/models/jp_address/zipcode.rb', line 101

def self._find_shared_name_from(names)
  return '' if names.blank?

  name_length_min = names.map{ |n| n.length }.min
  diff_pos        = nil
  chars           = []

  (0..(name_length_min - 1)).each do |pos|
    break if diff_pos.present?
    char = nil
    names.each do |name|
      if char.nil?
        char  = name.each_char.to_a[pos]
        chars << char
      elsif char != name.each_char.to_a[pos]
        diff_pos = pos
        break
      end
    end
  end

  if diff_pos.present? && diff_pos > 1
    ret = chars[0, diff_pos].join
    return ret
  end

  ''
end

._merge_same_zip_addressesObject

同じ郵便番号を持つレコードを統合します。

例:9896712

"宮城県","大崎市","鳴子温泉水沼"
"宮城県","大崎市","鳴子温泉南山"
"宮城県","大崎市","鳴子温泉山際"
"宮城県","大崎市","鳴子温泉和田"

これらは

"宮城県","大崎市","鳴子温泉" として1つのレコードにします。
共通する地名が抜き出せない場合は空の町名にします。


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'app/models/jp_address/zipcode.rb', line 75

def self._merge_same_zip_addresses
  group(:zip).having('count(*) > 1').pluck(:zip).each do |dup_zip|
    buf = nil
    town_names = []
    where(zip: dup_zip).order(:id).each_with_index do |rec, i|
      town_names << rec.town if rec.town.present?
      if i == 0
        buf = rec.dup
      end
      rec.destroy
    end
    shared_town_name = _find_shared_name_from(town_names)
    buf.town = shared_town_name
    buf.save!
  end
  nil
end

.download_master_file_from_japanpostObject



6
7
8
9
10
11
# File 'app/models/jp_address/zipcode.rb', line 6

def self.download_master_file_from_japanpost
  _setup_directory
  zip = _save_zip(_request_to_japanpost.body)
  _save_csv(zip.path)
  :success if File.exist?(MASTER_CSV_PATH)
end

.load_master_data(csv_path = MASTER_CSV_PATH) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'app/models/jp_address/zipcode.rb', line 49

def self.load_master_data(csv_path = MASTER_CSV_PATH)
  download_master_file_from_japanpost if !File.exist?(csv_path)
  _clear_table
  CSV.foreach(csv_path, encoding:'SJIS:UTF-8') do |row|
    connection.execute(
      sanitize_sql(
        ["insert into jp_address_zipcodes (zip, prefecture, city, town)
          values ('%s', '%s', '%s', '%s')", row[2], row[6], row[7], _remove_needless_words(row[8])
        ]
      )
    )
  end
  _merge_same_zip_addresses
  _remove_csv
end