2016-03-31 6 views
0

J'ai une application rails 4 et j'essaie d'implémenter la mise en cache. J'utilise la clé de cache @profiles_sidebar.first pour vérifier si un nouvel utilisateur a été créé. Je ne suis pas sûr que ce soit correct, car il y a toujours une requête db. Est-ce le mécanisme préféré pour vérifier si la mise en cache doit être expirée? Est-ce que je vais bien?rails4 après la requête de mise en cache s'exécute encore

<% cache(@profiles_sidebar.first) do %> 
    <% @profiles_sidebar.each do |profile| %> 
    <%= link_to user_path(profile.user) do %>    
     <%= truncate(profile.full_name, length: 25) %> 
     <%= truncate(profile.company, length:25) %> 
    <% end %> 
    <% end %> 
<% end %> 

code console lorsque le cache de lecture:

13:31:53 puma.1 | Profile Load (2.2ms) SELECT "profiles".* FROM "profiles" ORDER BY "profiles"."created_at" DESC LIMIT 1 
13:31:53 puma.1 | User Load (2.2ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (67) 
13:31:53 puma.1 | Cache digest for app/views/users/_user_sidebar.html.erb: bfc9447057c94bcfe13c18e391127f2d 
13:31:53 puma.1 | Read fragment views/profiles/62-20160331112332689423000/bfc9447057c94bcfe13c18e391127f2d (0.2ms) 
13:31:53 puma.1 | Rendered users/_user_sidebar.html.erb (11.8ms) 

Répondre

1

Il n'y a aucun moyen de se déplacer au moins une requête de base de données puisque vous devez savoir si l'enregistrement a été mis à jour depuis la digestion a été créé.

Vous pouvez charger @profiles_sidebar barre latérale dès le départ qui serait un peu mieux sur un cache « froid » depuis sa une seule requête DB:

@profiles_sidebar = Profile.order(created_at: :desc) 
          .limit(10) 
          .load 

La différence réelle entre aller chercher un seul enregistrement et 10 peut être marginal cependant.

Vous pouvez également utiliser eager loading or includes pour aller chercher l'utilisateur et le profil dans une requête:

@profiles_sidebar = Profile.includes(:user) 
          .order(created_at: :desc) 
          .limit(10) 
          .load 
+0

max, merci encore. Je vais créer une question de plus car je ne suis pas encore sûr de certaines choses. –

+0

Voici la nouvelle concernant le nommage des clés de cache: http://stackoverflow.com/questions/36336322/rails4-caching-naming-conventions –

0

Je suppose que vous êtes dans un environnement de développement, êtes-vous sûr que vous avez activé le cache dans des rails ?? (Par défaut, il est désactivé pour env dev)

Assurez-vous que vous avez cette ligne dans votre development.rb

config.action_controller.perform_caching = true 
+0

Il est activé. –