How can I override my cache key based on URL parameters?

I have a Profile#Index view where I do partial like this:

 <% 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 %> 

In the above example, labels are made at the bottom of the results, and these labels should only appear in the results when the params check in the above code is valid / true.

So, when the user logging in goes to / , he should see a list of profiles that works and looks like this:

vanilla-listing-correct

Then they run the same root_path, but with the parameters, and it looks (correctly) as follows:

params-listing-correct

However, the problem is that when I return to the root page, it mixes and matches the results from the param version of the page, with the usual vanilla from the root path, where it should only be the same results from the first image above (also like the result of vanilla).

jumbled-up-listing-wrong

How to fix it?

Change 1

In the Austio sentence, I added params[:rating] for both partial viewing and presentation of the collection.

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 do not work properly, but here are the request logs 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 an invalid 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 does not work. I hope this magazine illustrates what can help me figure this out.

Edit 2

When I add params[:rating] both my collection and partial cache keys, it still does not work on the root page (otherwise it shows invalid partial keys). Here is the log from the result:

 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) 
+6
source share
2 answers

It looks like your Profile#Index view uses collection caching for the part of the profile that uses the cache internal key:

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

This forces Lola Hessel and Jeremy Verley (as well as others) to cache when a registered user goes to / . A visit to root_path with parameters subsequently leads to caching of the remaining profiles. Then the third page is loaded, which contains a cache for each profile and makes them cached earlier. Caching in part of your profile has no effect, since the collection is cached first.

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

I assume that removing collection caching from partial rendering in combination with a properly adapted cache operator (for example, <% cache [profile, params[:rating].present?] do %> ) in the profile part does the trick.

+4
source

Add a rating to cache_key as the second parameter

 <% 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 point of view, I would just recommend having two different profiles, one with a rating and one without a code that 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 split between two partial ones can be reorganized. This explicitly allows you to find out what will be the difference between a partial render of a profile depending on whether a rating is present.

+2
source

Source: https://habr.com/ru/post/1012092/


All Articles