要件
サーバ種別と台数が保存されたテーブルがもともとあった。で、日付の前後で差分があった場合のみ抜き出して別テーブルに入れておきたい。
使うモデル
以下のカラムを持つServerCount
モデルを元に
ServerCountモデル | サーバの台数を保持 |
---|---|
server_type | サーバ種別(AppとかDBとか) |
server_count | 種別ごとのサーバの台数 |
created_at | Railsデフォルト。ここから日付ごとのサーバ台数がわかる |
ServerIncrementモデル | サーバの増減を保持するモデル |
---|---|
server_type | サーバ種別(AppとかDBとか) |
from_number | 増減前のサーバの台数 |
to_number | 増減後のサーバ台数 |
from_date | 増減前の日付 |
to_date | 増減後の日付 |
こんな感じで書いた
server_counts = ServerCount.all.order(created_at: :desc)
server_counts.each_cons(2) do |server|
next unless (server[0].server_count - server[1].server_count) != 0
next unless server[0].server_type.eql? server[1].server_type
ServerIncrement.find_or_create_by(
server_type: server[0].server_type,
from_number: server[0].server_count,
to_number: server[1].server_count,
from_date: server[0].created_at,
to_date: server[1].created_at
)
end
流れ
each_cons
メソッドで2つずつレコードを抜き出して前後の値を比較して0以外であり、かつ前後のサーバ種別が同じ
という条件をつける(これがないと違った種別のサーバ台数も比較してしまう)
そこからfind_or_created_byメソッド
で登録されていない場合のみレコード作成