jp_address 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|