From 16dfcc8044347e8b0f6065a7b49480c47ce0caee Mon Sep 17 00:00:00 2001 From: r7kamura Date: Fri, 16 Aug 2024 10:46:47 +0900 Subject: [PATCH] Add find-by-memoization section --- README.adoc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.adoc b/README.adoc index 47652a5..8c047da 100644 --- a/README.adoc +++ b/README.adoc @@ -1131,6 +1131,28 @@ The following methods behave differently without `all`: So, when considering removing `all` from the receiver of these methods, it is recommended to refer to the documentation to understand how the behavior changes. +=== `find_by` memoization [[find-by-memoization]] + +Avoid memoizing `find_by` results with `||=`. +`find_by` may return `nil`, in which case it will not be memoized as intended. + +[source,ruby] +---- +# bad +def current_user + @current_user ||= User.find_by(id: session[:user_id]) +end + +# good +def current_user + if instance_variable_defined?(:@current_user) + @current_user + else + @current_user = User.find_by(id: session[:user_id]) + end +end +---- + == Migrations === Schema Version [[schema-version]]