How do I bust my cache key based on the params in the URL?
Asked Answered
H

2

6

I have a Profile#Index view, where I render a partial like so:

<% cache @profiles do %>
  <div class="wrapper wrapper-content">
  <% @profiles.to_a.in_groups_of(3, false).each do |profiles| %>
      <div class="row">
         <%= render partial: "profile", collection: profiles, cached: true %>
      </div>
    <% end %>
  </div>
<% end %>

But in my app/views/profiles/_profile.html.erb, I have the following:

  <% cache profile do %>
    <% elsif current_user.has_role?(:coach) && params[:rating].present? %>
    <div class="contact-box-footer">
      <div class="row text-center avg-ratings">
        <div class="col-lg-3">
          <span class="label label-success">Speed: <%= profile.ratings.find_by(user: current_user).speed %></span>
        </div>
        <div class="col-lg-3">
          <span class="label label-info tackling">Tackling: <%= profile.ratings.find_by(user: current_user).tackling %></span>
        </div>
      </div>
    </div>
    <% end %>
  <% end %>

What the above does is produce the labels at the bottom of the results, and those labels should only come up on the results when there is the params check in the above code is valid/true.

So, when a logged in user goes to / they should see a list of profiles, which works and looks like this:

vanilla-listing-correct

Then they go trigger the same root_path but with params, and it looks (correctly) like this:

params-listing-correct

However, the issue is that when I go back to the root page, it mixes and matches the results from the param's version of the page, with the normal vanilla ones from the root_path, where it should just be the same results from the first image above (aka just the vanilla results).

jumbled-up-listing-incorrect

How do I fix this?

Edit 1

Per Austio's suggestion, I added the params[:rating] to both the partial view and the collection view.

So my app/views/profiles/_profile.html.erb now looks like this:

<% cache [params[:rating], profile] do %>
    <% elsif current_user.has_role?(:coach) && params[:rating].present? %>
    <div class="contact-box-footer">
      <div class="row text-center avg-ratings">
        <div class="col-lg-3">
          <span class="label label-success">Speed: <%= profile.ratings.find_by(user: current_user).speed %></span>
        </div>
        <div class="col-lg-3">
          <span class="label label-info tackling">Tackling: <%= profile.ratings.find_by(user: current_user).tackling %></span>
        </div>
      </div>
    </div>
    <% end %>
  <% end %>

Both don't work properly though, but here are the logs the requests with the code snippet above.

This is for the correct cached view.

Started GET "/profiles?rating=speed" for ::1 at 2016-11-07 10:05:34 -0500
Processing by ProfilesController#index as HTML
  Parameters: {"rating"=>"speed"}
  User Load (10.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 7], ["LIMIT", 1]]
  Role Load (3.3ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Role Load (4.1ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Role Load (2.6ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'player') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
   (2.7ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'player') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
   (2.1ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
   (4.9ms)  SELECT "ratings"."profile_id" FROM "ratings" WHERE "ratings"."user_id" = $1 ORDER BY "ratings"."speed" DESC  [["user_id", 7]]
  Profile Load (6.2ms)  SELECT "profiles".* FROM "profiles" WHERE "profiles"."id" IN (5, 18, 14, 7, 22, 13, 9, 17)
  Tournament Load (2.6ms)  SELECT  "tournaments".* FROM "tournaments" ORDER BY "tournaments"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Rendering profiles/index.html.erb within layouts/application
Read fragment views/profiles/5-20161105043153971213/profiles/18-20161101223838805685/profiles/14-20161105042425134917/profiles/7-20161101001052922220/profiles/22-20161106175803133611/profiles/13-20161104221749051281/profiles/9-20161104221706306433/profiles/17-20161105043606243802/59a852f082290d51847bb12ee90b9d25 (0.3ms)
  Rendered profiles/index.html.erb within layouts/application (15.0ms)
  CACHE (0.0ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Rendered shared/_navbar.html.erb (15.1ms)
  Rendered layouts/_messages.html.erb (1.8ms)
  Rendered shared/_footer.html.erb (0.6ms)
Completed 200 OK in 914ms (Views: 671.1ms | ActiveRecord: 39.3ms)

This is for the incorrect cached view:

Started GET "/" for ::1 at 2016-11-07 10:06:17 -0500
  User Load (8.8ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 7], ["LIMIT", 1]]
Processing by ProfilesController#index as HTML
  Role Load (6.4ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Role Load (2.8ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Role Load (3.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'player') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
   (6.2ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'player') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
   (5.1ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Profile Search (148.2ms)  curl http://localhost:9200/profiles_development/_search?pretty -d '{"query":{"match_all":{}},"size":1000,"from":0,"timeout":"11s","_source":false}'
  Tournament Load (2.3ms)  SELECT  "tournaments".* FROM "tournaments" ORDER BY "tournaments"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Rendering profiles/index.html.erb within layouts/application
  Profile Load (4.9ms)  SELECT "profiles".* FROM "profiles" WHERE "profiles"."id" IN (14, 22, 12, 21, 9, 5, 4, 15, 6, 7, 16, 18, 13, 23, 17)
Read fragment views/profiles/14-20161105042425134917/profiles/22-20161106175803133611/profiles/12-20161101225114614189/profiles/21-20161103035514173735/profiles/9-20161104221706306433/profiles/5-20161105043153971213/profiles/4-20161103035528589634/profiles/15-20161029013919242687/profiles/6-20161105043216951643/profiles/7-20161101001052922220/profiles/16-20161029020526832889/profiles/18-20161101223838805685/profiles/13-20161104221749051281/profiles/23-20161104062851335443/profiles/17-20161105043606243802/59a852f082290d51847bb12ee90b9d25 (6.3ms)
Read fragment views//profiles/12-20161101225114614189/01a5673b1dc193ec7173e62efba21a9b (0.1ms)
   (5.6ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL AND "votes"."vote_flag" = $5  [["voter_id", 7], ["voter_type", "User"], ["votable_id", 12], ["votable_type", "Profile"], ["vote_flag", true]]
  Position Load (3.2ms)  SELECT  "positions".* FROM "positions" INNER JOIN "positions_profiles" ON "positions"."id" = "positions_profiles"."position_id" WHERE "positions_profiles"."profile_id" = $1 ORDER BY "positions"."id" ASC LIMIT $2  [["profile_id", 12], ["LIMIT", 1]]
  School Load (4.4ms)  SELECT  "schools".* FROM "schools" WHERE "schools"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE (0.1ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
Write fragment views//profiles/12-20161101225114614189/01a5673b1dc193ec7173e62efba21a9b (0.2ms)
  Rendered collection of profiles/_profile.html.erb [2 / 3 cache hits] (68.4ms)
Read fragment views//profiles/21-20161103035514173735/01a5673b1dc193ec7173e62efba21a9b (0.1ms)
   (2.8ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL AND "votes"."vote_flag" = $5  [["voter_id", 7], ["voter_type", "User"], ["votable_id", 21], ["votable_type", "Profile"], ["vote_flag", true]]
  Position Load (2.6ms)  SELECT  "positions".* FROM "positions" INNER JOIN "positions_profiles" ON "positions"."id" = "positions_profiles"."position_id" WHERE "positions_profiles"."profile_id" = $1 ORDER BY "positions"."id" ASC LIMIT $2  [["profile_id", 21], ["LIMIT", 1]]
  School Load (3.8ms)  SELECT  "schools".* FROM "schools" WHERE "schools"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
Write fragment views//profiles/21-20161103035514173735/01a5673b1dc193ec7173e62efba21a9b (2.2ms)
  Rendered collection of profiles/_profile.html.erb [2 / 3 cache hits] (46.5ms)
Read fragment views//profiles/4-20161103035528589634/01a5673b1dc193ec7173e62efba21a9b (0.0ms)
   (2.6ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL AND "votes"."vote_flag" = $5  [["voter_id", 7], ["voter_type", "User"], ["votable_id", 4], ["votable_type", "Profile"], ["vote_flag", true]]
  Position Load (2.6ms)  SELECT  "positions".* FROM "positions" INNER JOIN "positions_profiles" ON "positions"."id" = "positions_profiles"."position_id" WHERE "positions_profiles"."profile_id" = $1 ORDER BY "positions"."id" ASC LIMIT $2  [["profile_id", 4], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT  "schools".* FROM "schools" WHERE "schools"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
Write fragment views//profiles/4-20161103035528589634/01a5673b1dc193ec7173e62efba21a9b (0.1ms)
Read fragment views//profiles/15-20161029013919242687/01a5673b1dc193ec7173e62efba21a9b (0.1ms)
   (2.3ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL AND "votes"."vote_flag" = $5  [["voter_id", 7], ["voter_type", "User"], ["votable_id", 15], ["votable_type", "Profile"], ["vote_flag", true]]
  Position Load (5.3ms)  SELECT  "positions".* FROM "positions" INNER JOIN "positions_profiles" ON "positions"."id" = "positions_profiles"."position_id" WHERE "positions_profiles"."profile_id" = $1 ORDER BY "positions"."id" ASC LIMIT $2  [["profile_id", 15], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT  "schools".* FROM "schools" WHERE "schools"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (3.7ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
Write fragment views//profiles/15-20161029013919242687/01a5673b1dc193ec7173e62efba21a9b (0.1ms)
Read fragment views//profiles/6-20161105043216951643/01a5673b1dc193ec7173e62efba21a9b (0.3ms)
   (2.9ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL AND "votes"."vote_flag" = $5  [["voter_id", 7], ["voter_type", "User"], ["votable_id", 6], ["votable_type", "Profile"], ["vote_flag", true]]
  Position Load (3.0ms)  SELECT  "positions".* FROM "positions" INNER JOIN "positions_profiles" ON "positions"."id" = "positions_profiles"."position_id" WHERE "positions_profiles"."profile_id" = $1 ORDER BY "positions"."id" ASC LIMIT $2  [["profile_id", 6], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT  "schools".* FROM "schools" WHERE "schools"."id" = $1 LIMIT $2  [["id", 2], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
Write fragment views//profiles/6-20161105043216951643/01a5673b1dc193ec7173e62efba21a9b (0.1ms)
  Rendered collection of profiles/_profile.html.erb [0 / 3 cache hits] (83.4ms)
Read fragment views//profiles/16-20161029020526832889/01a5673b1dc193ec7173e62efba21a9b (0.0ms)
   (2.3ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL AND "votes"."vote_flag" = $5  [["voter_id", 7], ["voter_type", "User"], ["votable_id", 16], ["votable_type", "Profile"], ["vote_flag", true]]
  Position Load (3.9ms)  SELECT  "positions".* FROM "positions" INNER JOIN "positions_profiles" ON "positions"."id" = "positions_profiles"."position_id" WHERE "positions_profiles"."profile_id" = $1 ORDER BY "positions"."id" ASC LIMIT $2  [["profile_id", 16], ["LIMIT", 1]]
  CACHE (0.2ms)  SELECT  "schools".* FROM "schools" WHERE "schools"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
Write fragment views//profiles/16-20161029020526832889/01a5673b1dc193ec7173e62efba21a9b (0.1ms)
  Rendered collection of profiles/_profile.html.erb [2 / 3 cache hits] (28.6ms)
Read fragment views//profiles/23-20161104062851335443/01a5673b1dc193ec7173e62efba21a9b (0.1ms)
   (1.8ms)  SELECT COUNT(*) FROM "votes" WHERE "votes"."voter_id" = $1 AND "votes"."voter_type" = $2 AND "votes"."votable_id" = $3 AND "votes"."votable_type" = $4 AND "votes"."vote_scope" IS NULL AND "votes"."vote_flag" = $5  [["voter_id", 7], ["voter_type", "User"], ["votable_id", 23], ["votable_type", "Profile"], ["vote_flag", true]]
  Position Load (2.9ms)  SELECT  "positions".* FROM "positions" INNER JOIN "positions_profiles" ON "positions"."id" = "positions_profiles"."position_id" WHERE "positions_profiles"."profile_id" = $1 ORDER BY "positions"."id" ASC LIMIT $2  [["profile_id", 23], ["LIMIT", 1]]
  School Load (2.2ms)  SELECT  "schools".* FROM "schools" WHERE "schools"."id" = $1 LIMIT $2  [["id", 3], ["LIMIT", 1]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
Write fragment views//profiles/23-20161104062851335443/01a5673b1dc193ec7173e62efba21a9b (0.1ms)
  Rendered collection of profiles/_profile.html.erb [2 / 3 cache hits] (27.6ms)
Write fragment views/profiles/14-20161105042425134917/profiles/22-20161106175803133611/profiles/12-20161101225114614189/profiles/21-20161103035514173735/profiles/9-20161104221706306433/profiles/5-20161105043153971213/profiles/4-20161103035528589634/profiles/15-20161029013919242687/profiles/6-20161105043216951643/profiles/7-20161101001052922220/profiles/16-20161029020526832889/profiles/18-20161101223838805685/profiles/13-20161104221749051281/profiles/23-20161104062851335443/profiles/17-20161105043606243802/59a852f082290d51847bb12ee90b9d25 (0.1ms)
  Rendered profiles/index.html.erb within layouts/application (357.4ms)
  CACHE (0.0ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Rendered shared/_navbar.html.erb (20.6ms)
  Rendered layouts/_messages.html.erb (2.4ms)
  Rendered shared/_footer.html.erb (0.6ms)
Completed 200 OK in 1704ms (Views: 1262.0ms | Searchkick: 148.2ms | ActiveRecord: 89.4ms)

It still doesn't work. Hopefully that log illustrates something that can help me get to the bottom of this.

Edit 2

When I add params[:rating] to both my collection & partial cache keys, it still doesn't work on the root_page (aka it shows incorrect partials). Here is the log from the result of that:

Started GET "/" for ::1 at 2016-11-07 11:50:15 -0500
  User Load (23.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 7], ["LIMIT", 1]]
Processing by ProfilesController#index as HTML
  Role Load (2.3ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Role Load (4.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Role Load (3.9ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'player') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
   (4.2ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'player') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
   (1.8ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Profile Search (157.6ms)  curl http://localhost:9200/profiles_development/_search?pretty -d '{"query":{"match_all":{}},"size":1000,"from":0,"timeout":"11s","_source":false}'
  Tournament Load (4.6ms)  SELECT  "tournaments".* FROM "tournaments" ORDER BY "tournaments"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Rendering profiles/index.html.erb within layouts/application
  Profile Load (7.1ms)  SELECT "profiles".* FROM "profiles" WHERE "profiles"."id" IN (14, 22, 12, 21, 9, 5, 4, 15, 6, 7, 16, 18, 13, 23, 17)
Read fragment views//profiles/14-20161105042425134917/profiles/22-20161106175803133611/profiles/12-20161101225114614189/profiles/21-20161103035514173735/profiles/9-20161104221706306433/profiles/5-20161105043153971213/profiles/4-20161103035528589634/profiles/15-20161029013919242687/profiles/6-20161105043216951643/profiles/7-20161101001052922220/profiles/16-20161029020526832889/profiles/18-20161101223838805685/profiles/13-20161104221749051281/profiles/23-20161104062851335443/profiles/17-20161105043606243802/c6925e7eaf791cab78909b69752bd7f8 (0.3ms)
  Rendered profiles/index.html.erb within layouts/application (30.5ms)
  CACHE (0.0ms)  SELECT COUNT(*) FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)) OR ((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'admin') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  CACHE (0.1ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1 AND (((roles.name = 'coach') AND (roles.resource_type IS NULL) AND (roles.resource_id IS NULL)))  [["user_id", 7]]
  Rendered shared/_navbar.html.erb (26.9ms)
  Rendered layouts/_messages.html.erb (3.3ms)
  Rendered shared/_footer.html.erb (0.9ms)
Completed 200 OK in 1677ms (Views: 1264.0ms | Searchkick: 157.6ms | ActiveRecord: 28.1ms)
Hippodrome answered 7/11, 2016 at 4:42 Comment(3)
What happens if you remove the cache call on @profiles and only use the one in the partial?Eustace
can you also add your latest code?Eustace
@Eustace If I remove the cache call on @profiles, that still doesn't fix the issue. In my latest code I removed all of the cache calls, because they were all breaking my interface. I have tried every permutation though. i.e. cache in 1 place, in all places, and alternating the combinations....but no dice. Is there a specific combination you want to me try (e.g. no @profiles but on profile in _profile.html.erb)? If so, what results do you want me to publish? The logs? Tell me what you are looking for specifically.Hippodrome
S
4

It looks like your Profile#Index view is making use of collection caching for the profile partial which makes use of an internal cache key:

<%= render partial: "profile", collection: profiles, cached: true %>

This is causing Lola Hessel and Jeremy Verley (as well as the others) being cached when a logged in user goes to /. Visiting the root_path with params afterwards causes the remaining profiles to be cached. The third page load then has cache hits for every profile and renders them as cached before. The caching within your profile partial has no effect since the collection caching serves first.

You can read about that here: http://guides.rubyonrails.org/caching_with_rails.html#collection-caching

I assume, that removing the collection caching from your partial rendering combined with a properly adapted cache statement (such as <% cache [profile, params[:rating].present?] do %>) within the profile partial does the trick.

Sailfish answered 16/11, 2016 at 13:22 Comment(4)
When you say properly adapted cache key within the profile partial, what do you mean? Do you mean this: <% cache [params[:rating], profile] do %>?Hippodrome
Yes, exactly. A cache key, that uniquely identifies the different display possiblities of a profile. As far as I can see, the presence of params[:rating] makes the difference here. Since the respective params[:rating] does not make a difference in what is being displayed, a cache key like <% cache [profile, params[:rating].present?] do %> would probably be more specific and memory efficient.Kowalczyk
Bro, this is perfect. The only issue I am having now is that I my params[:rating] can have different values. So now I am no longer seeing the same value between my profile?ratings view and my profiles#Index view. But, I am seeing the same view when I do profiles?rating=speed or profiles?rating=tackling. When I check the logs, I am seeing lots of Read fragments from both views (which indicates that the cache is not being busted correctly). How do I bust the key for each params[:rating] value correctly, as opposed to just the presence?Hippodrome
Actually I got it. All I have to do is simply cache [profile, params[:rating]]. I think what was happening is that I was doing [params[:rating], profile] which was screwing up some stuff, I think, plus the collection cache. Thanks very much for this.Hippodrome
C
2

Add the rating to the cache_key as the second param

<% 
   caching_key = [@profile]
   caching_key << "with_rating" if params[:rating].present?
   #TODO: Refactor this to cache_key_for_profile(@profile, params) helper
   cache caching_key do 
%>

From a design perspective, I'd recommend just having two different profile partials, one with the rating and one without so your code would look like

<div class="row">
  <% if params[:ratings].present? %>
    <%= render partial: "profile_with_rating", collection: profiles, cached: true %>
  <% else %>
    <%= render partial: "profile", collection: profiles, cached: true %>
  <% end %>
</div>

Code that is shared between the two partials can be refactored. This explicitly lets you know that there is going to be a difference between the rendered profile partial depending on if the rating are present.

Colettecoleus answered 16/11, 2016 at 2:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.