初めに
ポートフォリオのライク機能を作成した際に、DBのデータは変更されているのにインスタンスのデータは更新されていなかった。
環境
- Rails 6.1.4
- Ruby 2.7.4
結論
SQLキャッシュがされていたので、同じSQLを発行した場合キャッシュされたデータ(更新前のデータ)が返ってきた。
解決方法
SQLキャッシュは
- 同じクエリが発生すると、データベースへのクエリを実行せずに、キャッシュされた結果を返す
-
SQLキャッシュは、アクションの開始時に作成され、アクションの終了時に破棄されるので、アクションの実行中しか保持されない。
なので、reloadメソッドを利用することでキャッシュを使わずに再取得できます。
like_controller.rb
class LikesController < ApplicationController
def create
review = Review.find(params[:review_id])
like = Like.create(user: current_user, review: review)
review.reload
respond_to do |format|
format.js
format.html {redirect_to root_path}
end
end
end
これにより、SQLが再度発行され最新のデータがDBから取得されます。