Skip to content

Commit

Permalink
Search for a specified item #24
Browse files Browse the repository at this point in the history
  • Loading branch information
chocoby committed Jan 27, 2021
1 parent 284ed92 commit be516ef
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 30 deletions.
66 changes: 48 additions & 18 deletions lib/jp_prefecture/prefecture.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,36 +47,49 @@ def self.build(code, name, name_e, name_h = nil, name_k = nil, area = nil)
# JpPrefecture::Prefecture.find(1)
# JpPrefecture::Prefecture.find(code: 1)
#
# # 都道府県名から検索
# # 都道府県名から検索 (前方一致)
# JpPrefecture::Prefecture.find(name: '北海道')
#
# # 都道府県名から検索(前方一致)
# JpPrefecture::Prefecture.find(name: '東京')
#
# # 英語表記の都道府県名から検索
# JpPrefecture::Prefecture.find(name: 'Hokkaido')
# JpPrefecture::Prefecture.find(name: 'hokkaido')
# JpPrefecture::Prefecture.find(name_e: 'Hokkaido')
# JpPrefecture::Prefecture.find(name_e: 'hokkaido')
#
# # ひらがな表記の都道府県名から検索
# JpPrefecture::Prefecture.find(name_h: 'ほっかいどう')
#
# # カタカナ表記の都道府県名から検索
# JpPrefecture::Prefecture.find(name_k: 'ホッカイドウ')
#
# # マッピングに定義しているすべてのフィールドから検索
# JpPrefecture::Prefecture.find(all_fields: '東')
#
# @param args [Integer] 都道府県コード
# @param [Hash] args 検索条件
# @option args [Integer] :code 都道府県コード
# @option args [String] :name 都道府県名/英語/ひらがな/カタカナ表記の都道府県名
# @option args [Integer] :zip 郵便番号
# @param args [Hash<Symbol, Integer>] :code 都道府県コード
# @param args [Hash<Symbol, String>] :name 漢字表記/:name_e 英語表記/:name_h ひらがな表記/:name_k カタカナ表記
# @param args [Hash<Symbol, Integer>] :zip 郵便番号
# @param args [Hash<Symbol, (String, Integer)>] :all_fields マッピングに定義しているすべてのフィールドから検索
# @return [JpPrefecture::Prefecture] 都道府県が見つかった場合は都道府県クラス
# @return [nil] 都道府県が見つからない場合は nil
def self.find(args)
return if args.nil?

code = if args.is_a?(Integer) || args.is_a?(String)
code = case args
when Integer, String
args.to_i
else
case args.keys[0]
when :name
find_code_by_name(args[:name])
when Hash
search_field = args.keys.first
search_value = args.values.first

case search_field
when :all_fields
find_code_by_name_from_all_fields(search_value)
when :name, :name_e, :name_h, :name_k, :area
find_code_by_name(search_field, search_value)
when :code
args[:code].to_i
search_value.to_i
when :zip
ZipMapping.code_for_zip(args[:zip].to_i)
ZipMapping.code_for_zip(search_value.to_i)
end
end

Expand Down Expand Up @@ -116,8 +129,25 @@ def self.all
# @param name [String] 検索する都道府県名
# @return [Integer] 見つかった場合は都道府県コード
# @return [nil] 見つからない場合は nil
def self.find_code_by_name(name)
return nil if name.nil? || name.empty?
def self.find_code_by_name(field, name)
return if name.nil? || name.empty?

name = name.downcase

Mapping.data.each do |m|
return m[0] if m[1][field].start_with?(name)
end

nil
end

# 名前から都道府県コードを前方一致で検索
#
# @param name [String] 検索する都道府県名
# @return [Integer] 見つかった場合は都道府県コード
# @return [nil] 見つからない場合は nil
def self.find_code_by_name_from_all_fields(name)
return if name.nil? || name.empty?

name = name.downcase

Expand Down
32 changes: 20 additions & 12 deletions spec/prefecture_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -66,23 +66,23 @@
end

describe '都道府県名(英語表記)' do
it_behaves_like '都道府県が見つかる', name: 'Hokkaido'
it_behaves_like '都道府県が見つからない', name: 'Udon'
it_behaves_like '都道府県が見つかる', name_e: 'Hokkaido'
it_behaves_like '都道府県が見つからない', name_e: 'Udon'
end

describe '都道府県名(英語表記-小文字)' do
it_behaves_like '都道府県が見つかる', name: 'hokkaido'
it_behaves_like '都道府県が見つからない', name: 'udon'
it_behaves_like '都道府県が見つかる', name_e: 'hokkaido'
it_behaves_like '都道府県が見つからない', name_e: 'udon'
end

describe '都道府県名(ひらがな表記)' do
it_behaves_like '都道府県が見つかる', name: 'ほっかいどう'
it_behaves_like '都道府県が見つからない', name: 'うどん'
it_behaves_like '都道府県が見つかる', name_h: 'ほっかいどう'
it_behaves_like '都道府県が見つからない', name_h: 'うどん'
end

describe '都道府県名(カタカナ表記)' do
it_behaves_like '都道府県が見つかる', name: 'ホッカイドウ'
it_behaves_like '都道府県が見つからない', name: 'ウドン'
it_behaves_like '都道府県が見つかる', name_k: 'ホッカイドウ'
it_behaves_like '都道府県が見つからない', name_k: 'ウドン'
end

describe '都道府県名(前方一致)' do
Expand All @@ -98,25 +98,33 @@
end

context 'マッチする都道府県が複数あった場合(英語表記)' do
let(:pref) { JpPrefecture::Prefecture.find(name: 'miya') }
let(:pref) { JpPrefecture::Prefecture.find(name_e: 'miya') }
it { expect(pref.name_e).to eq 'Miyagi' }

let(:pref2) { JpPrefecture::Prefecture.find(name: 'Miya') }
let(:pref2) { JpPrefecture::Prefecture.find(name_e: 'Miya') }
it { expect(pref2.name_e).to eq 'Miyagi' }
end

context 'マッチする都道府県が複数あった場合(ひらがな表記)' do
let(:pref) { JpPrefecture::Prefecture.find(name: 'みや') }
let(:pref) { JpPrefecture::Prefecture.find(name_h: 'みや') }
it { expect(pref.name_h).to eq 'みやぎけん' }
end

context 'マッチする都道府県が複数あった場合(カタカナ表記)' do
let(:pref) { JpPrefecture::Prefecture.find(name: 'ミヤ') }
let(:pref) { JpPrefecture::Prefecture.find(name_k: 'ミヤ') }
it { expect(pref.name_k).to eq 'ミヤギケン' }
end
end
end

describe 'all_fields' do
context '指定する場合' do
let(:pref) { JpPrefecture::Prefecture.find(all_fields: '東') }
# area の「東北」が最初にマッチする
it { expect(pref.name).to eq '青森県' }
end
end

describe '渡した変数について' do
context 'string の場合' do
it '値が変更されないこと' do
Expand Down

0 comments on commit be516ef

Please sign in to comment.