開発環境
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 を反映させる
すると
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 の前にコールバックが走るのでちゃんと保存される



