Chapter 02無料公開

Data Update Scriptsとは

さて、「Data Update Scripts」とは一体何なのでしょうか?

devtoのOSSプロジェクト名であるforemの開発者向けのドキュメントにも個別のページが設けられています。
開発者向けドキュメント内の「Data Update Scriptsページ」

このページに記載されている「What are Data Update Scripts?」の部分を訳してみました。

以下著者訳

Data Update Scriptsは このPull Requestで導入された機能で、様々なデータ更新処理を可能にするものです。
たとえば、DBに新しいカラムを追加したときに、そのカラムに何かしらの値を入れ込みたい場合があったとします。
そのような場合にコンソール画面から手動で行う代わりに、Data Update Scriptを使うことができます。
他の例を1つあげますと、Elasticsearchに新しい属性を追加したときに、Data Update Scriptを使って全モデルのindexを再構築することができます。

どういったものかイメージできたでしょうか?
理解を深めるために実際の使用例を1つ見てみましょう。

使用例 Update hotness score for Tags

こちらのPull Request で「Data Update Scripts」が使われています。

このPull Requestで何をしているかを理解するための前提として下記があります。

  1. devtoでは記事に「javascript」や「discuss」のようなTagを付けられる
  2. Tagは現状どれくらい盛り上がっているどうかの値(= hotness score)をデータとして保持している

そして、このPull RequestはTagごとのhotness scoreの計算方法を変更するものです。
ですので、計算方法を変えた後に、全てのTagのhotness scoreを再計算する必要があります。

この再計算する処理を行うために「Data Update Scripts」が使用されています。

下記がこのPull Requestにおいての「データを更新するscript」です。
lib/data_update_scripts/20200324133751_update_tag_hotness_scores.rb

module DataUpdateScripts
  class UpdateTagHotnessScores
    def run
      # Saving a tag will trigger calculate_hotness_score
      Tag.find_each(&:save)
    end
  end
end

ファイルの中身はとてもシンプルで、runメソッド内でTag.find_each(&:save)を呼び出しているだけです。
コメントに記載されているように、Tagクラスのsaveのコールバックbefore_savehotness_scoreを計算するメソッドcalculate_hotness_scoreが設定されています。
ですので、この記述だけで全てのTagのhotness_scoreが再計算されます。

また、このファイルはlib/data_update_scriptsディレクトリに配置されています。
github上のlib/data_update_scripts

このディレクトリに配置されているscriptファイルはデプロイ後に自動的に実行されるようになっています。
(どのような仕組みになっているかは、後ほど解説します。)

改めてData Update Scriptsとは

使用例を見てみたところで、改めて「Data Update Scripts」とは何かを整理してみましょう。
端的に説明してみますと次のように表現できると思います。

  1. 「データを更新するscript」の形式を「rubyのrunメソッドを持つクラス」と決める
  2. それらのscriptをデプロイ後に自動的に実行する仕組みを提供する

主な役割としては、前述の使用例のように仕様や設計の変更に伴ったデータ更新処理を行う際に使用されるものです。

ちなみに、「データ更新処理の内容をscriptファイルとしてコードベースにコミットし、デプロイ後に自動的に実行される」という仕組みは次のようなメリットがあると考えられます。

  • データ更新処理の内容(scriptファイル)を仕様の変更内容と共にレビューできる
  • データ更新処理のやり方の知見を共有できる(lib/data_update_scriptsディレクトリを見るだけで「大体こうやればいいんだな」という感覚が掴める)
  • 仕組み化されているので、データを更新する手順を毎回考えなくていい(最初から仕組みに合わせることを前提として作業ができる)

ここまで、「Data Update Scripts」がどういうものかを見てきました。
次は、実際にどのように実装されているかを見ていきます。