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?

Foi útil?

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

Criar um escopo nomeado em seu modelo Post que encapsula o comportamento aleatório:

class Post < ActiveRecord::Base
  named_scope :random, :order => 'RANDOM()'
  .
  .
  .
end

Seu código PostsController torna-se então:

@posts = Post.random.paginate :page => params[:page]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top