開発環境
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
で seed
f を反映させる
すると
latitude
と longitude
が反映されてない
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
メソッドに変えてみた。
で、また反映
すると
反映された。
どうやら seed
メソッドではコールバックは走らないっぽい
追記
最初は after_validation
が悪いと思って after_create
に変えてみた。
結果的にはそれでもだめだった
ただそのおかげでコールバックの細かい挙動の違いが発見できた。
seed
ではなくコンソール上でコールバックが走るのか確認したかったので
こんなふうに実在する住所のみをいれて登録すると
コールバックが走って緯度経度が入る
これ自体は想定内。
しかし
再度確認すると消えている。
これはコールバックのタイミングが after_create
なので
API を叩いてもその後保存するっていう処理が走らないため
after_validation
だと create
の前にコールバックが走るのでちゃんと保存される