Si vous utilisez PostgreSQL 9.5+, vous pouvez profiter de TABLESAMPLE
pour sélectionner un enregistrement aléatoire.
Les deux méthodes d'échantillonnage par défaut ( SYSTEM
etBERNOULLI
) nécessitent que vous spécifiiez le nombre de lignes à renvoyer sous forme de pourcentage du nombre total de lignes de la table.
-- Fetch 10% of the rows in the customers table.
SELECT * FROM customers TABLESAMPLE BERNOULLI(10);
Cela nécessite de connaître la quantité d'enregistrements dans le tableau pour sélectionner le pourcentage approprié, qui peut ne pas être facile à trouver rapidement. Heureusement, il y a le tsm_system_rows
module qui permet de spécifier le nombre de lignes à renvoyer directement.
CREATE EXTENSION tsm_system_rows;
-- Fetch a single row from the customers table.
SELECT * FROM customers TABLESAMPLE SYSTEM_ROWS(1);
Pour l'utiliser dans ActiveRecord, activez d'abord l'extension dans une migration:
class EnableTsmSystemRowsExtension < ActiveRecord::Migration[5.0]
def change
enable_extension "tsm_system_rows"
end
end
Puis modifiez le from
clause de la requête:
customer = Customer.from("customers TABLESAMPLE SYSTEM_ROWS(1)").first
Je ne sais pas si la SYSTEM_ROWS
méthode d'échantillonnage sera entièrement aléatoire ou si elle renvoie simplement la première ligne d'une page aléatoire.
La plupart de ces informations proviennent d'un article de blog 2ndQuadrant rédigé par Gulcin Yildirim .