Class: JpAddress::Zipcode
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- JpAddress::Zipcode
- Defined in:
- app/models/jp_address/zipcode.rb
Constant Summary collapse
- MASTER_CSV_PATH =
'tmp/ken_all.csv'
Class Method Summary collapse
-
._find_shared_name_from(names) ⇒ Object
引数に渡された地名群から、先頭から見て共通となる地名を返します。.
-
._merge_same_zip_addresses ⇒ Object
同じ郵便番号を持つレコードを統合します。.
- .download_master_file_from_japanpost ⇒ Object
- .load_master_data(csv_path = MASTER_CSV_PATH) ⇒ Object
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_addresses ⇒ Object
同じ郵便番号を持つレコードを統合します。
例: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_japanpost ⇒ Object
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 |