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 ( SYSTEMetBERNOULLI ) 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_rowsmodule 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_ROWSmé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 .