Paginate através de uma lista aleatória de posts usando will_paginate
-
03-07-2019 - |
Pergunta
Eu quero dar aos usuários a capacidade de página através de meus posts em ordem aleatória.
Eu não posso implementá-lo como este:
@posts = Post.paginate :page => params[:page], :order => 'RANDOM()'
desde o parâmetro :order
é chamado com cada consulta, e, portanto, corro o risco de repetir posts.
Qual é a melhor maneira de fazer isso?
Solução
RAND aceita uma semente no MySQL:
RAND(N)
A partir da MySQL docs :
RAND (), RAND (N)
Retorna um valor aleatório de ponto flutuante v na faixa de 0 <= v <1,0. Se um argumento inteiro constante N é especificado, é usado como a semente valor, o que produz uma repetível sequência de valores de coluna. No seguinte exemplo, nota que as sequências de valores produzidos por RAND (3) é o mesmo ambos os locais em que ocorre.
Outras bases de dados deve ter uma funcionalidade semelhante.
Se você usar o MESMO semente de cada vez que você chama RAND, a ordem será consistente em pedidos e você pode paginar em conformidade.
Você pode então armazenar a semente na sessão do usuário - de modo que cada usuário verá um conjunto de resultados únicos para eles.
Outras dicas
Para evitar cada página (gerada a partir de um novo pedido) potencialmente ter um repetida post que você vai precisar para armazenar a ordem de postos de algum lugar para a recuperação ao longo de vários pedidos.
Se você quiser que cada usuário tenha uma ordem aleatória única, em seguida, salvar a ordem em um array de sessão de IDs.
Se você não se importa todos os usuários com a mesma ordem aleatória, em seguida, ter uma coluna posição na tabela de mensagens.
Você pode:. Order => RANDOM () em sua consulta original que preenche @posts, e então quando você paginar, não especificar a ordem