2011-05-14 5 views
1
@user_id = params[:user_id] 
@picture = Picture.scoped 
if @user_id.present? 
    @picture = @picture.where("user_id not in (?)", params[:user_id]) 
end 
@picture = @picture.rand(@picture.count).first 

respond_to do |format| 
    format.html { redirect_to(@picture) } 
    format.json { render :json => @picture } 
end 

Je reçois l'erreur suivante: NoMethodError à PicturesController # suivant méthode privée `rand » a appelé à []: ActiveRecord :: RelationObtenir un enregistrement aléatoire d'un ensemble de résultats

Au lieu de

@picture = @picture.rand(@picture.count).first 

J'ai aussi essayé

@picture = Picture.offset(rand(Picture.count)).first 

et obtenir cette erreur à la place: ActiveRecord :: StatementInvalid dans PicturesController # suivant Mysql2 :: Erreur: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près « ,6704131293122307 » à la ligne 1:. SELECT pictures * FROM pictures LIMIT 1 OFFSET 0,6704131293122307

Qu'est-ce que je fais mal, ou comment allez-je à propos de obtenir un enregistrement aléatoire à partir du tableau des résultats? Merci d'avance.

Répondre

3

converti rand résultat en nombre entier comme ceci:

@picture = Picture.offset(rand(Picture.count).to_i).first 
2

En Ruby 1.9.2, vous pouvez juste faire:

@picture.sample 
+0

n'a pas besoin que @picture est une collection de lignes déjà lues de la base de données? s'il n'a qu'à retourner une ligne, aller chercher tout et en sélectionner un n'est pas bon;) –

+0

@Andrian Je suis d'accord. Je viens juste d'un remplacement de sa ligne de trouble. – sawa

+0

Cela fonctionne, mais selon les commentaires, j'ai marqué Adrian comme la meilleure réponse. Merci les gars! – areyling

Questions connexes