Ignorando o cache de consulta ActiveRecord

ActiveRecord, por padrão, armazena em cache as consultas para desempenho. Você pode ver algo como os seguintes registros:

User Load (84.6ms)  SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1
CACHE
(0.0ms) SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1
CACHE
(0.0ms) SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1
CACHE
(0.0ms) SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1
CACHE
(0.0ms) SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1

A primeira consulta sql, na verdade, é executada no banco de dados e é armazenada em cache para as 4 chamadas subsequentes, de modo que você só incorre em uma ocorrência do banco de dados. No entanto, às vezes, esses podem não ser os resultados desejados. No exemplo acima, cada vez que você espera um usuário aleatório diferente, no entanto, como os resultados da consulta foram armazenados em cache, você continuará recebendo o mesmo usuário (por exemplo, Joe), em vez de (Joe, Jill, Edward, …)
Para fazer isso direito, precisamos desativar o cache para esta consulta e isso pode ser feito com o escopo sem cache :

uncached do
active
.where("badges_count > 1").order("Random()").limit(limit)
end

isso resultará nas 5 consultas individuais esperadas com resultados distintos:

User Load (84.2ms)  SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1
User Load (83.0ms) SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1
User Load (83.8ms) SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1
User Load (83.3ms) SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1
User Load (83.2ms) SELECT "users".* FROM "users" WHERE "users"."state" = 'active' AND (badges_count > 1) ORDER BY Random() LIMIT 1