`rails db:seed`でGoogle Places APIを使用して、取得したレストラン一覧をDBに保存する方法

## 開発環境
- Rails 8
- Ruby 3.3.6
- Postgresql 14.14

## 読んで欲しい人
- Google Places APIってどんな感じで使うんだろう、と軽く知りたい人
- 過去の自分

## Google Places APIってなに

> Places API は、位置情報に関する HTTP リクエストを受け付けるサービスです

[概要  \|  Places API  \|](https://developers.google.com/maps/documentation/places/web-service/overview?hl=ja)

簡単にいうと

Googleのデータベースにある、さまざまな施設情報やスポット情報を検索、取得できるAPIです

## Google Places APIを使う準備

### APIキーの取得

API_keyを取得します

https://developers.google.com/maps/documentation/places/web-service/get-api-key?hl=ja&_gl=1*1xjo822*_up*MQ..*_ga*MTg0MTcyMTc5OS4xNzM2MjQ4Mjgx*_ga_NRWSTWS78N*MTczNjI0ODI4MC4xLjEuMTczNjI0ODI4MS4wLjAuMA..

https://www.zenrin-datacom.net/solution/gmapsapi/api_key

### APIキーをcredentialに保存

下記で、`credentials.yml.enc`を編集します

```
$ EDITOR="vi" bin/rails credentials:edit
```

キーボード`i`を押して編集モードに

```credentials.yml.enc
google:
  api_key: # 取得したapi_keyをここに保存する
```

`esc`キーを押し、`:wq`で保存して閉じます。

そうすると`Rails.application.credentials.google.api_key`でapi_keyを表示することができます。

### gem 'google_places'をダウンロードする

`gemfile`に`google_places`をインストールします

```ruby
gem 'google_places'
```

**gem 'google_places'ってなんのgem?**

Google Place APIとやり取りをするためのRuby用のGemです
RubyコードからAPIを操作するためには必要す

これでPlace APIを使う準備ができました。

## Consoleで遊んでみる

試しに`rails c`コマンドで遊んでみます。

```ruby
client = GooglePlaces::Client.new(Rails.application.credentials.google.api_key)
```

最初に、APIクライアントのインスタンスを作成してあげます

```ruby
client.spots(-33.8670522, 151.1957362)
```
作成したインスタンスから`spots`を使用して、第一引数には緯度、第二引数には経度を渡してあげます。

そうすると下記のように大量のデータが返されます

```json
sample-app(dev)> client = GooglePlaces::Client.new(Rails.application.credentials.google.api_key)
   {"geometry"=>
     {"location"=>{"lat"=>-33.8688197, "lng"=>151.2092955},
      "viewport"=>{"northeast"=>{"lat"=>-33.57814094522021, "lng"=>151.3430209458699}, "southwest"=>{"lat"=>-34.11834699888443, "lng"=>150.5209286026224}}},
    "icon"=>"https://maps.gstatic.com/mapfiles/place_api/icons/v1/png_71/geocode-71.png",
    "icon_background_color"=>"#7B9EB0",
    "icon_mask_base_uri"=>"https://maps.gstatic.com/mapfiles/place_api/icons/v2/generic_pinlet",
    "name"=>"Sydney",
    "photos"=>
     [{"height"=>2922,
       "html_attributions"=>["<a href=\"https://maps.google.com/maps/contrib/103312383445637053560\">Elena Gallo</a>"],
       "photo_reference"=>
        "AWYs27zT9yl3rip6iCEDg_Ejx1Iw01vwsaPj1oJve8UJnTQoEC2DM57q019uUgChOJ9EQvvl-6gHCy2OPM2fzfU2YV0RAt9T9vqOLg1Dx2yeveFJp-hsBVy3PIwWDx734wj1r3aZLsrKTUyRcXJPxDWC_Oryb19WyAy0hVagS7_QjknLRQg1",
       "width"=>4344}],
    "place_id"=>"ChIJP3Sa8ziYEmsRUKgyFmh9AQM",
    "reference"=>"ChIJP3Sa8ziYEmsRUKgyFmh9AQM",
    "scope"=>"GOOGLE",
    "types"=>["colloquial_area", "locality", "political"],
    "vicinity"=>"Sydney"},
  @lat=-33.8688197,
  @lng=151.2092955,
```

引数に現在地の緯度、経度を入れて遊んでみてください

[現在地の緯度と経度を出してくれるWebサイト](https://testpage.jp/tool/gps_ido_keido.php)

他にも色々な遊び方があります

```ruby
client.spots(-33.8670522, 151.1957362, :types => 'restaurant')
```
これはスポットのタイプをレストランに限定して検索をかけてくれます

```ruby
client.spots_by_query('東京駅')
```
これは特定のキーワードや名前でスポット検索をしてくれるメソッドです

## 取得した情報をseeds.rbに書き込んで、DBに保存してみる

今回はshopsテーブルを作成してみました

```schema.rb
  create_table "shops", force: :cascade do |t|
    t.string "name", null: false
    t.string "place_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["place_id"], name: "index_shops_on_place_id", unique: true
  end
```

※ `place_id`というのはapiから返される、placeの一意のidです

seeds.rbには下記のように記述しました

```seeds.rb
client = GooglePlaces::Client.new(Rails.application.credentials.google.api_key)

spots = client.spots(任意の緯度, 任意の経度, radius: 500, types: 'restaurant', language: 'ja')

spots.each do |spot|
  next unless spot

  Shop.create!(
    name: spot.name,
    place_id: spot.place_id
  )
end
```

- `radius` : 半径をm単位
- `language` : 言語の指定

`rails db:seed`を実行してあげる、終了

## 感想

- `place_id`が一意って本当なんすかね、とんでもないすね
- 割と簡単にAPIを利用できて楽しい

## 参考

https://developers.google.com/maps?hl=ja&_gl=1*qcw7yl*_up*MQ..*_ga*MTYyNDg1MTgzNi4xNzM2MjQ5MTM0*_ga_NRWSTWS78N*MTczNjI1MTEyMC4yLjEuMTczNjI1MTEzMS4wLjAuMA..

https://github.com/qpowell/google_places

https://labo.kon-ruri.co.jp/rails-google-places-api/#index_id2