Class: JpAddressComplement::Searcher

Inherits:
Object
  • Object
show all
Defined in:
lib/jp_address_complement/searcher.rb

Overview

コア検索ロジック Repository を注入して使用することで ActiveRecord への直接依存を排除する

Instance Method Summary collapse

Constructor Details

#initialize(repository) ⇒ Searcher

Returns a new instance of Searcher.



12
13
14
# File 'lib/jp_address_complement/searcher.rb', line 12

def initialize(repository)
  @repository = repository
end

Instance Method Details

#search_by_postal_code(code) ⇒ Array<AddressRecord>

7桁郵便番号から住所レコードを検索する

Parameters:

  • code (String, nil) —

    郵便番号

Returns:



20
21
22
23
24
25
# File 'lib/jp_address_complement/searcher.rb', line 20

def search_by_postal_code(code)
  normalized = Normalizer.normalize_postal_code(code)
  return [] if normalized.nil?

  @repository.find_by_code(normalized)
end

#search_by_postal_code_prefix(prefix) ⇒ Array<AddressRecord>

郵便番号プレフィックスから住所候補を検索する(4桁以上)

Parameters:

  • prefix (String, nil) —

    郵便番号の先頭部分

Returns:



31
32
33
34
35
36
# File 'lib/jp_address_complement/searcher.rb', line 31

def search_by_postal_code_prefix(prefix)
  normalized = Normalizer.normalize_prefix(prefix)
  return [] if normalized.nil?

  @repository.find_by_prefix(normalized)
end

#search_postal_codes_by_address(pref:, city:, town: nil) ⇒ Array<[String, AddressRecord]>

都道府県・市区町村・町域から郵便番号候補を取得する(逆引き)。町域は前方一致。

Parameters:

  • pref (String) —

    都道府県名(正式名称)

  • city (String) —

    市区町村名

  • town (String, nil) (defaults to: nil) —

    町域名。省略時は都道府県+市区町村のみ。指定時は前方一致で候補を返す

Returns:

  • (Array<[String, AddressRecord]>) —

    [郵便番号, AddressRecord] の配列。該当なし・入力不十分時は []



63
64
65
66
67
68
69
# File 'lib/jp_address_complement/searcher.rb', line 63

def search_postal_codes_by_address(pref:, city:, town: nil)
  return [] if pref.nil? || pref.to_s.strip.empty?
  return [] if city.nil? || city.to_s.strip.empty?

  records = @repository.find_postal_codes_by_address(pref: pref, city: city, town: town)
  records.map { |r| [r.postal_code, r] }
end

#valid_combination?(postal_code, address) ⇒ Boolean

郵便番号と住所文字列の整合性を検証する 日本郵便の utf_ken_all.csv は町域に「字」「大字」を含まないため、 市区町村の直後に「字」「大字」が付いた住所(省略可能な表記)も一致とみなす。

Parameters:

  • postal_code (String, nil) —

    郵便番号

  • address (String, nil) —

    住所文字列

Returns:

  • (Boolean)


45
46
47
48
49
50
51
52
53
54
55
# File 'lib/jp_address_complement/searcher.rb', line 45

def valid_combination?(postal_code, address)
  return false if postal_code.nil? || address.nil?

  normalized = Normalizer.normalize_postal_code(postal_code)
  return false if normalized.nil?

  records = @repository.find_by_code(normalized)
  return false if records.empty?

  records.any? { |record| address_matches_record?(address, record) }
end