2010-12-01 6 views
0

Je voudrais trouver la première image valide parmi une liste dans ruby. Voici mon code:soustraire des symboles dans ruby ​​

if(params[:id]) 

    @image = Image.find_by_id(params[:id]) 
    while @image.nil? 
    :id-- ? 
    @image = Image.find_by_id(params[:id]) 
    end 

Dans ce bloc, comment puis-je garder diminuer la id # jusqu'à ce qu'une image valide se trouve? :/

Merci!

Répondre

9

Vous ne pouvez pas soustraire d'un symbole. Un symbole n'est pas un nombre.

Ce que vous semblez vouloir faire est de diminuer la valeur de params[:id], ce qui est bien sûr tout à fait possible (après conversion de l'identifiant de chaîne en entier) en faisant params[:id] = params[:id].to_i - 1 ou

id = params[:id].to_i 
while @image.nil? 
    @image = Image.find_by_id(id) 
    id -= 1 
end 

Ce dernier est mieux que le premier parce qu'il ne mute pas params (qu'il n'y a pas de bonne raison de faire).

Cependant, vous ne devriez pas faire non plus de ceux-ci, parce que vous pouvez y parvenir avec beaucoup moins de tracas, en laissant le db faire le travail:

Image.find(:first, :order => "id DESC", :conditions => ["id <= ?", params[:id]]) 

PS: Ruby n'a pas un opérateur -- , donc vous devez utiliser -= 1 pour décrémenter un nombre.

+1

Vous ne devriez pas utiliser find_by_id (id), pas find_by_id (params [: id])? Autrement, @image sera toujours la même, car vous ne décrémenterez pas la valeur dans les paramètres. –

+0

@Sam: Oui, bien sûr. Stupide de moi. – sepp2k

+0

Pas de soucis, et +1 à votre réponse! –