I'm using Devise for authentication in my Rails app. I'd like to eager load some of a users associated models in some of my controllers. Something like this:
class TeamsController < ApplicationController
def show
@team = Team.includes(:members).find params[:id]
current_user.includes(:saved_listings)
# normal controller stuff
end
end
How can I achieve this?
I ran into the same issue and although everyone keeps saying there's no need to do this, I found that there is, just like you. So this works for me:
# in application_controller.rb:
def current_user
@current_user ||= super && User.includes(:saved_listings).find(@current_user.id)
end
Note that this will load the associations in all controllers. For my use case, that's exactly what I need. If you really want it only in some controllers, you'll have to tweak this some more.
This will also call User.find
twice, but with query caching that shouldn't be a problem, and since it prevents a number of additional DB hits, it still is a performance gain.
Override serialize_from_session
in your User
model.
class User
devise :database_authenticatable
def self.serialize_from_session key, salt
record = where(id: key).eager_load(:saved_listings, roles: :accounts).first
record if record && record.authenticatable_salt == salt
end
end
This will however, eager load on all requests.
Why not do it with default_scope on the model?
like so:
Class User < ActiveRecord::Base
...
default_scope includes(:saved_listings)
...
end