UserモデルとPlayerモデルの間にhas_one
関連付けがあります。コントローラーとビューで current_user.player を何度も実行していることに気づき、そのたびに DB にアクセスしすぎているように感じます。また、current_player メソッドがあると便利です。
current_player
コントローラーとビューの両方からアクセスできるように、そのようなメソッドをどこでどのように定義すればよいでしょうか?
UserモデルとPlayerモデルの間にhas_one
関連付けがあります。コントローラーとビューで current_user.player を何度も実行していることに気づき、そのたびに DB にアクセスしすぎているように感じます。また、current_player メソッドがあると便利です。
current_player
コントローラーとビューの両方からアクセスできるように、そのようなメソッドをどこでどのように定義すればよいでしょうか?
ページにアクセスするたびに少なくとも 1 回は (適切に) リロードされますが、結果をメモすることで次のロードを防ぐことができます。
class User
has_one :player
def current_player
@current_player ||= player
end
end
別の方法として、プレーヤー モデルをデフォルト スコープに含めることもできます。これにより、User モデルがロードされるたびにロードされます。
class User
has_one :player
default_scope includes(:player)
end
残念ながら、試してみると、実際には毎回他のテーブルを自動ロードしたくないことがすぐにわかり、最初の使用時に2番目のテーブルからのみロードする以前の方法に戻ります。オブジェクトを単純に ivar にメモする方が、はるかに柔軟です。