Si está utilizando PostgreSQL 9.5+, puede aprovechar TABLESAMPLE
para seleccionar un registro aleatorio.
Los dos métodos de muestreo predeterminados ( SYSTEM
y BERNOULLI
) requieren que especifique el número de filas a devolver como un porcentaje del número total de filas en la tabla.
-- Fetch 10% of the rows in the customers table.
SELECT * FROM customers TABLESAMPLE BERNOULLI(10);
Esto requiere conocer la cantidad de registros en la tabla para seleccionar el porcentaje apropiado, que puede no ser fácil de encontrar rápidamente. Afortunadamente, existe el tsm_system_rows
módulo que le permite especificar el número de filas para devolver directamente.
CREATE EXTENSION tsm_system_rows;
-- Fetch a single row from the customers table.
SELECT * FROM customers TABLESAMPLE SYSTEM_ROWS(1);
Para usar esto dentro de ActiveRecord, primero habilite la extensión dentro de una migración:
class EnableTsmSystemRowsExtension < ActiveRecord::Migration[5.0]
def change
enable_extension "tsm_system_rows"
end
end
Luego modifique la from
cláusula de la consulta:
customer = Customer.from("customers TABLESAMPLE SYSTEM_ROWS(1)").first
No se si el SYSTEM_ROWS
método de muestreo será completamente aleatorio o si solo devuelve la primera fila de una página aleatoria.
La mayor parte de esta información fue tomada de una publicación de blog de 2ndQuadrant escrita por Gulcin Yildirim .