Se você estiver usando o PostgreSQL 9.5+, poderá tirar proveito de TABLESAMPLE
para selecionar um registro aleatório.
Os dois métodos de amostragem padrão ( SYSTEM
e BERNOULLI
) exigem que você especifique o número de linhas a serem retornadas como uma porcentagem do número total de linhas na tabela.
-- Fetch 10% of the rows in the customers table.
SELECT * FROM customers TABLESAMPLE BERNOULLI(10);
Isso requer conhecer a quantidade de registros na tabela para selecionar a porcentagem apropriada, o que pode não ser fácil de encontrar rapidamente. Felizmente, existe o tsm_system_rows
módulo que permite especificar o número de linhas a serem retornadas diretamente.
CREATE EXTENSION tsm_system_rows;
-- Fetch a single row from the customers table.
SELECT * FROM customers TABLESAMPLE SYSTEM_ROWS(1);
Para usar isso no ActiveRecord, primeiro habilite a extensão dentro de uma migração:
class EnableTsmSystemRowsExtension < ActiveRecord::Migration[5.0]
def change
enable_extension "tsm_system_rows"
end
end
Em seguida, modifique a from
cláusula da consulta:
customer = Customer.from("customers TABLESAMPLE SYSTEM_ROWS(1)").first
Não sei se o SYSTEM_ROWS
método de amostragem será inteiramente aleatório ou se ele retorna a primeira linha de uma página aleatória.
A maioria dessas informações foi retirada de um post do 2ndQuadrant escrito por Gulcin Yildirim .