1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Geocoder seed データの反映でコールバックが発生しない

Posted at

開発環境

ruby 2.6.5
Ruby on Rails 5.2.5

前提

神社テーブルがあり、その住所カラムに geocoder をコールバックさせている
seed_fu をつかって seed データを作成している
説明上関係ないカラムは無視してください

本題

神社の CSV ファイルの seed データを反映する。

そのタイミングで住所カラムにコールバックさせて緯度と経度を登録したかった

モデルには以下のように定義

class Shinto < ApplicationRecord
  geocoded_by :address
  after_validation :geocode
end

seed データには以下

import_read('test_shinto.csv') do |line, idx|
  Shinto.seed do |s|
    s.id      = idx
    s.name = line[0]
    s.image = line[1]
    s.address = line[2]
    s.origin_shrine = line[3]
    s.original_url = line[4]
    s.kamisama = line[5]
    s.origin_term = line[6]
    s.origin_history = line[7]
  end
end

seedf を反映させる
すると

Image from Gyazo

latitudelongitude が反映されてない


seed ファイルを以下のようにした

import_read('test_shinto.csv') do |line, idx|
  Shinto.create do |s|
    s.id      = idx
    s.name = line[0]
    s.image = line[1]
    s.address = line[2]
    s.origin_shrine = line[3]
    s.original_url = line[4]
    s.kamisama = line[5]
    s.origin_term = line[6]
    s.origin_history = line[7]
  end
end

seed_fu をつかっていたので最初は seed メソッドで反映したんだけど
create メソッドに変えてみた。

で、また反映
すると

Image from Gyazo

反映された。
どうやら seed メソッドではコールバックは走らないっぽい

追記

最初は after_validation が悪いと思って after_create に変えてみた。
結果的にはそれでもだめだった

ただそのおかげでコールバックの細かい挙動の違いが発見できた。

seed ではなくコンソール上でコールバックが走るのか確認したかったので

Image from Gyazo

こんなふうに実在する住所のみをいれて登録すると
コールバックが走って緯度経度が入る

これ自体は想定内。

しかし

Image from Gyazo

再度確認すると消えている。

これはコールバックのタイミングが after_create なので
API を叩いてもその後保存するっていう処理が走らないため

after_validation だと create の前にコールバックが走るのでちゃんと保存される

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?