ループ前に参照したメソッドの返り値をループ中に参照した同一のメソッドの返り値と比較したかった

やりたかったこと

def perform
  # ループ前のcountメソッドの値を参照する
  before_count = count

  missions.each do |mission|
    # missionに達成日を挿入する
    mission.completed_at = Time.current
    mission.save!

    # 上で達成日が入ったのでここはbefore_countより数が多くなるはず
    after_count = count
    total_count = after_count > before_count ? after_count : nil
    notify_mission_complete(total_count)
  end
end

# 達成していないmissionの数をDBから参照する
def count
  missions.where(completed_at: nil).count
end

問題点

・before_countもafter_countも同一のメソッドを参照しているため、object_idが同じで、値も同じになる。

解決

・「達成していないmissionをDBから参照するメソッド」をbefore_countとafter_countそれぞれで用意する。

def perform
  before_count = before_not_completed_missions.count

  missions.each do |mission|
    mission.completed_at = Time.current
    mission.save!

    after_count = after_not_completed_missions.count
    total_count = after_count > before_count ? after_count : nil
    notify_mission_complete(total_count)
  end
end

def before_not_completed_missions
  missions.where(completed_at: nil)
end

def after_not_completed_missions
  missions.where(completed_at: nil)
end

中身が同じメソッドが2つできてしまうが、これで目的の動作が実現できた。