jp_address 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +26 -10
- data/app/models/jp_address/zipcode.rb +66 -0
- data/lib/jp_address/version.rb +1 -1
- data/spec/dummy/log/test.log +29 -0
- data/spec/models/jp_address/zipcode_spec.rb +35 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71e8a270d6771b635d0de517833ad5b21c97558800c2ef459c2493cdc68f8ec9
|
4
|
+
data.tar.gz: 960f5bc5a54d66f929ab141cee756099b71a9f3a66f64a2ea757ce4e772ae84b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1ab63af145ca2654ea5383bf459eea3465678013a32589304c46daea4e9f69e99c03ab9bcd4f7db4a43dea9ebcaa00bc5b3c6ffc9fd0591bf5285fee1dae664
|
7
|
+
data.tar.gz: a87ecc0525afaa28ed2c75caaacdae8ff98191b3118d7d990b5066b1eb95c677e40f1addc0ce3fa47626fdaa6dd26ede79bbb2d3b5d4590f59a5f6da67483682
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Ruby on Rails 6 で 郵便番号住所検索 な gem
|
2
2
|
|
3
3
|
## JpAddressとは
|
4
|
-
日本郵便の「[郵便番号データ](https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)
|
4
|
+
日本郵便の「[郵便番号データ](https://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html)」を用いて、あなたの Rails 6.1 サイトに「郵便番号からの住所検索機能」を組み込むための gem です。
|
5
5
|
以下の機能を提供します。
|
6
6
|
|
7
7
|
* [[郵便番号データ](https://www.post.japanpost.jp/zipcode/dl/oogaki/zip/ken_all.zip "ken_all.zip")]をダウンロードして自前DBのテーブル(jp_address_zipcodes)にロードするクラスメソッド。(```JpAddress::Zipcode.load_master_data```)
|
@@ -36,13 +36,30 @@ $ bundle exec rails runner -e development 'JpAddress::Zipcode.load_master_data'
|
|
36
36
|
$ bundle exec rails runner -e production 'JpAddress::Zipcode.load_master_data'
|
37
37
|
```
|
38
38
|
|
39
|
-
|
39
|
+
環境にもよりますが、5分ぐらいかかると思います。
|
40
40
|
|
41
|
-
|
42
|
-
|
41
|
+
APP_ROOT/tmp/ を作業ディレクトリに使用しています。<br>
|
42
|
+
最初にテーブルをトランケートしますので、毎回「全件insert」になります。<br>
|
43
|
+
|
44
|
+
同じ郵便番号を持つレコードは統合されます。<br>
|
45
|
+
<br>
|
46
|
+
例:9896712<br>
|
47
|
+
```
|
48
|
+
"宮城県","大崎市","鳴子温泉水沼"
|
49
|
+
"宮城県","大崎市","鳴子温泉南山"
|
50
|
+
"宮城県","大崎市","鳴子温泉山際"
|
51
|
+
"宮城県","大崎市","鳴子温泉和田"
|
52
|
+
```
|
53
|
+
これらは先頭から共通する地名を探し、うまく見つかれば
|
54
|
+
```
|
55
|
+
"宮城県","大崎市","鳴子温泉"
|
56
|
+
```
|
57
|
+
として1つのレコードにします。
|
58
|
+
共通する地名が抜き出せない場合は空の町名にします。
|
43
59
|
|
44
60
|
### APIのマウント
|
45
61
|
Railsアプリの config/routes.rb に追記。
|
62
|
+
at: に渡す値は /jp_address でなくても /service や /api などでも構いません。
|
46
63
|
```ruby
|
47
64
|
mount JpAddress::Engine, at: "/jp_address"
|
48
65
|
```
|
@@ -68,15 +85,12 @@ http://localhost:3000/jp_address/zipcodes/search?zip=5330033
|
|
68
85
|
3. #address (住所を表示するテキストボックス)
|
69
86
|
|
70
87
|
の3要素があるとします。<br>
|
71
|
-
#zipcodeに入れられた値を keyup イベントで拾ってAPI
|
88
|
+
#zipcodeに入れられた値を keyup イベントで拾ってAPIを叩き、都道府県プルダウンを選択し、住所をセットするサンプルです。<br>
|
89
|
+
郵便番号の半角ハイフンは自動でカットされます。
|
72
90
|
|
73
91
|
都道府県プルダウンは、戻ってくるJSONの "prefecture" すなわち都道府県名で選択します。<br>
|
74
92
|
ですので、お持ちの都道府県マスターの各レコードがどのようなIDを持っていても構いません。
|
75
93
|
|
76
|
-
※ JQuery の存在を前提にしています。<br>
|
77
|
-
※ 郵便番号の半角ハイフンは自動でカットされます。<br>
|
78
|
-
※ もともと CoffeeScript で書いてあったソースを decaffeinate したものですので冗長です。本質的な処理はAddressSearch が担っているだけで、他の関数は decaffeinate に必要なだけです。
|
79
|
-
|
80
94
|
#### フォーム
|
81
95
|
```
|
82
96
|
<form>
|
@@ -135,7 +149,9 @@ http://localhost:3000/jp_address/zipcodes/search?zip=5330033
|
|
135
149
|
```
|
136
150
|
|
137
151
|
#### application.js など共通に読み込まれるファイルに配置するJavaScript
|
138
|
-
|
152
|
+
※ JQuery の存在を前提にしています。<br>
|
153
|
+
※ もともと CoffeeScript で書いてあったソースを decaffeinate したものですので冗長です(汗)。<br>
|
154
|
+
本質的な処理はAddressSearch 関数が担っているだけで、他の関数は decaffeinate に必要なだけです。
|
139
155
|
```js script
|
140
156
|
function _classCallCheck(instance, Constructor) {
|
141
157
|
if (!(instance instanceof Constructor)) {
|
@@ -58,9 +58,75 @@ module JpAddress
|
|
58
58
|
)
|
59
59
|
)
|
60
60
|
end
|
61
|
+
_merge_same_zip_addresses
|
61
62
|
_remove_csv
|
62
63
|
end
|
63
64
|
|
65
|
+
# 同じ郵便番号を持つレコードを統合します。
|
66
|
+
#
|
67
|
+
# 例:9896712
|
68
|
+
# "宮城県","大崎市","鳴子温泉水沼"
|
69
|
+
# "宮城県","大崎市","鳴子温泉南山"
|
70
|
+
# "宮城県","大崎市","鳴子温泉山際"
|
71
|
+
# "宮城県","大崎市","鳴子温泉和田"
|
72
|
+
# これらは
|
73
|
+
# "宮城県","大崎市","鳴子温泉" として1つのレコードにします。
|
74
|
+
# 共通する地名が抜き出せない場合は空の町名にします。
|
75
|
+
def self._merge_same_zip_addresses
|
76
|
+
group(:zip).having('count(*) > 1').pluck(:zip).each do |dup_zip|
|
77
|
+
buf = nil
|
78
|
+
town_names = []
|
79
|
+
where(zip: dup_zip).order(:id).each_with_index do |rec, i|
|
80
|
+
town_names << rec.town if rec.town.present?
|
81
|
+
if i == 0
|
82
|
+
buf = rec.dup
|
83
|
+
end
|
84
|
+
rec.destroy
|
85
|
+
end
|
86
|
+
shared_town_name = _find_shared_name_from(town_names)
|
87
|
+
buf.town = shared_town_name
|
88
|
+
buf.save!
|
89
|
+
end
|
90
|
+
nil
|
91
|
+
end
|
92
|
+
|
93
|
+
# 引数に渡された地名群から、先頭から見て共通となる地名を返します。
|
94
|
+
#
|
95
|
+
# input = %w[鳴子温泉小身川
|
96
|
+
# 鳴子温泉川袋
|
97
|
+
# 鳴子温泉木戸脇
|
98
|
+
# ]
|
99
|
+
#
|
100
|
+
# return => 鳴子温泉
|
101
|
+
def self._find_shared_name_from(names)
|
102
|
+
return '' if names.blank?
|
103
|
+
|
104
|
+
name_length_min = names.map{ |n| n.length }.min
|
105
|
+
diff_pos = nil
|
106
|
+
chars = []
|
107
|
+
|
108
|
+
(0..(name_length_min - 1)).each do |pos|
|
109
|
+
break if diff_pos.present?
|
110
|
+
char = nil
|
111
|
+
names.each do |name|
|
112
|
+
if char.nil?
|
113
|
+
char = name.each_char.to_a[pos]
|
114
|
+
chars << char
|
115
|
+
elsif char != name.each_char.to_a[pos]
|
116
|
+
diff_pos = pos
|
117
|
+
break
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
if diff_pos.present? && diff_pos > 1
|
123
|
+
ret = chars[0, diff_pos].join
|
124
|
+
return ret
|
125
|
+
end
|
126
|
+
|
127
|
+
''
|
128
|
+
end
|
129
|
+
|
64
130
|
def self._clear_table
|
65
131
|
begin
|
66
132
|
connection.truncate 'jp_address_zipcodes'
|
data/lib/jp_address/version.rb
CHANGED
data/spec/dummy/log/test.log
CHANGED
@@ -4,3 +4,32 @@
|
|
4
4
|
[1m[35m (0.1ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
5
5
|
[1m[35m (0.1ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
6
6
|
[1m[35m (0.2ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
7
|
+
[1m[35m (4.1ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
8
|
+
Processing by JpAddress::ZipcodesController#search as HTML
|
9
|
+
Completed 500 Internal Server Error in 0ms (ActiveRecord: 0.1ms | Allocations: 325)
|
10
|
+
[1m[35m (1.1ms)[0m [1m[31mDELETE FROM "jp_address_zipcodes"[0m
|
11
|
+
[1m[35m (3.8ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
12
|
+
Processing by JpAddress::ZipcodesController#search as HTML
|
13
|
+
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.1ms | Allocations: 325)
|
14
|
+
[1m[35m (1.4ms)[0m [1m[31mDELETE FROM "jp_address_zipcodes"[0m
|
15
|
+
[1m[35m (4.1ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
16
|
+
[1m[35m (3.3ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
17
|
+
[1m[35m (3.7ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
18
|
+
[1m[35m (3.7ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
19
|
+
[1m[35m (3.8ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
20
|
+
[1m[35m (3.8ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
21
|
+
[1m[35m (3.8ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
22
|
+
[1m[35m (4.1ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
23
|
+
[1m[35m (3.7ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
24
|
+
[1m[35m (3.9ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
25
|
+
[1m[35m (3.6ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
26
|
+
[1m[35m (3.8ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
27
|
+
[1m[35m (3.7ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
28
|
+
[1m[35m (3.6ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
29
|
+
Processing by JpAddress::ZipcodesController#search as HTML
|
30
|
+
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms | Allocations: 325)
|
31
|
+
[1m[35m (1.0ms)[0m [1m[31mDELETE FROM "jp_address_zipcodes"[0m
|
32
|
+
[1m[35m (3.8ms)[0m [1m[34mSELECT sqlite_version(*)[0m
|
33
|
+
Processing by JpAddress::ZipcodesController#search as HTML
|
34
|
+
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.1ms | Allocations: 321)
|
35
|
+
[1m[35m (1.0ms)[0m [1m[31mDELETE FROM "jp_address_zipcodes"[0m
|
@@ -25,5 +25,40 @@ module JpAddress
|
|
25
25
|
expect(JpAddress::Zipcode.send(:_remove_needless_words, '大通西(1~19丁目)')).to eq '大通西'
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
describe "._find_shared_name_from" do
|
30
|
+
it "find shared name" do
|
31
|
+
list = %w[
|
32
|
+
鳴子温泉小身川
|
33
|
+
鳴子温泉川袋
|
34
|
+
鳴子温泉木戸脇
|
35
|
+
鳴子温泉黒崎
|
36
|
+
鳴子温泉小室
|
37
|
+
鳴子温泉小室山
|
38
|
+
鳴子温泉境松
|
39
|
+
]
|
40
|
+
expect(JpAddress::Zipcode.send(:_find_shared_name_from, list)).to eq '鳴子温泉'
|
41
|
+
|
42
|
+
list = %w[
|
43
|
+
大通東
|
44
|
+
大通西
|
45
|
+
大通西
|
46
|
+
]
|
47
|
+
expect(JpAddress::Zipcode.send(:_find_shared_name_from, list)).to eq '大通'
|
48
|
+
|
49
|
+
list = %w[
|
50
|
+
大通西
|
51
|
+
大通東
|
52
|
+
旭ケ丘
|
53
|
+
]
|
54
|
+
expect(JpAddress::Zipcode.send(:_find_shared_name_from, list)).to eq ''
|
55
|
+
|
56
|
+
list = %w[
|
57
|
+
大分
|
58
|
+
大阪
|
59
|
+
]
|
60
|
+
expect(JpAddress::Zipcode.send(:_find_shared_name_from, list)).to eq ''
|
61
|
+
end
|
62
|
+
end
|
28
63
|
end
|
29
64
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jp_address
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tad Kam
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-06-
|
11
|
+
date: 2021-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|