記事を書いた背景
業務としてはエンドユーザーからやってくる、お問い合わせを元に、修正・仕様確認・緊急対応etcを行なっています。
エンジニアになった時は、開発こそエンジニアだと思っていたが、実際のところは日々起こる、小さな修正だったり、どデカイ緊急対応だったりをどれだけシンプルなロジックで早く対応できるかがエンジニアの本領発揮ポイントかなと思っています。
まぁ、なんやかんや書きましたが過去の僕みたいな人の助けになったら幸いです笑
スクリプトたち
1.更新の際、しっかりrescue
サービスを大きくするには開発が必要で、開発すると何かしらバグるのは必然。(バグらない努力は当然行うべきだが、これは運命)
そしてバグると意図しないデータが色々とできてしまう。
意図しないデータを意図する形に更新する時のスクリプトが結構怖いもので、
ここをミスると2次被害になりバタンキュー。
更新が途中で失敗すると結構詰むので、以下のように更新がうまくいかない世界線も予期してしっかりrescueしてあげよう。
# 内容
# 今回は顧客のデータ(User.rb)が訳あってバグってしまって、正しい値に更新する時のスクリプト
# 不具合顧客のidがわかっている場合、target_user_idsに配列として定義
target_user_ids = [1,2,10,20,21,22,...]
# update_failure_listsは更新失敗したUserのidとその時のエラーメッセージを格納する空配列
update_failure_lists = []
def updates_data user, update_failure_lists
ActiveRecord::Base.transaction do
# ここに正しく更新したい内容記述
# ex
# user.update!(name: 正社員石川)
end
rescue => e
error_message = "Reason::" + e.message
update_failure_lists << [user.id, error_message]
end
User.where(id: target_user_ids).each do |user|
updates_data user, update_failure_lists
end
このスクリプトの好きなところは以下の箇所で、
更新が失敗してもActiveRecord::BaseしてるのでRollBackしてrescueに入り、
rescueに入った後も、どうして更新がミスったのかがわかるのが結構便利です。
rescue => e
error_message = "Reason::" + e.message
update_failure_lists << [user.id, error_message]
end
2.不具合時刻から対象を洗い出す
不具合時刻から誤ったデータを探す際に以下のスクリプトをよく使う。
# 内容
# 2021年3月1日24:00から2021年3月1日06:00の間で不具合があり、その時間帯の顧客データを洗い出すスクリプト
# +0900とかは自分のサービス毎に確認してね
from_time = "2021-03-01T-00:00:00 +0900".to_datetime
to_time = "2021-03-01T-06:00:00 +0900".to_datetime
User.where(created_at: from_time..to_time)
正直この程度のことはruby・rails初学者向けの本に書いてありそうだが、
緊急の場合は、頭が真っ白になったり、自分の開発が生んだバグだったりすると、手が止まってしまうことがある。
なので一旦コードの意味を理解したらどこかにテンプレを作成して未来に備えて保存することをオススメします。
3.たまに出てこなくなる曖昧検索
ruby,rails学びたての頃、部分一致の検索方法がよくわからず、毎回調べていたので多分みんな同じ悩みを抱えると思い記述。
SQLではどうやって書いてるのかも調べると繋がりがわかって理解が深まると思います。
コンソール叩いて走るSQL見るでもいいかも
モデル.where("{カラム} LIKE ?", "{%調べたい言葉%}")
# ex
# User.where("name LIKE ?", "%ニート%")
# → user(name: ニート石川)がヒット
# 実際は「ニート%」でいける
まとめ
パッと思い浮かぶスクリプトを3つ記載いたしました。
後半2つはスクリプトと言えるのか微妙ですが結構ど忘れしちゃうポイントかなと思いこれもまた一局。
他にも、間違えて更新した場合の対応スクリプトだったり、テーブルが4,5以上紐づいてるデータを洗い出するeach・mapスクリプトとかあるのですが需要があったらまたいつか書きます笑
なんやかんや誰かの役にたったら嬉しいなぁ