2011-06-02 3 views
1

Mon code ressemble à ceci, et cela fonctionne:capture true/false résultat d'une opération

if Target.find_by_shrunk(params[:shrunk]) 
    @target = Target.find_by_shrunk(params[:shrunk]) 
else 
    # do something else 
end 

Target::find_by_shrunk(params[:shrunk]) est appelé deux fois. Afin d'éviter cela, je veux exécuter Target.find_by_shrunk(params[:shrunk]) une fois, attraper le résultat true/false, puis utiliser cette variable dans l'instruction conditionnelle. J'ai essayé de faire ceci:

does_it_exist = (this_target = Target.find_by_shrunk(params[:shrunk])) 
if does_it_exist 
    @target = this_target 
else 
    # do something else 
end 

Mais malheureusement cela ne fait pas ce que je veux.

Comment puis-je simultanément effectuer une affectation et saisir le résultat vrai/faux de l'exécution de cette affectation de sorte que je n'ai pas à exécuter deux fois de suite le même élément de code (cher)?

+0

bizarre, le second morceau de code devrait fonctionner. Vous pouvez l'écrire un peu plus propre mais devrait fonctionner. – robertodecurnex

+0

Dans votre deuxième code, l'affectation à 'does_it_exist' est redondante. C'est exactement la même chose que 'this_target'. – sawa

+0

Il est tout à fait possible que j'ai eu l'idée juste et fait une sorte d'erreur de syntaxe ailleurs qui l'a fait casser. Après l'avoir réécrit pour ressembler à la réponse de Ricardo Panaggio, ça a marché. Comme je l'ai dit, je suis un peu un ruby ​​noob, donc je pense qu'il est tout à fait possible que j'avais fait quelque chose de mal ailleurs qui l'a cassé. – Joshua

Répondre

4

Vous pouvez faire

unless @target = Target.find_by_shrunk(params[:shrunk]) 
    # do something else 
end 

unless est le même que if not. Une attribution renvoie la valeur attribuée, et si elle est différente de nil et false, elle est évaluée à true.

+0

Oui! Cela a fonctionné parfaitement. Merci beaucoup. Vous venez de faire courir cette requête deux fois plus vite! – Joshua

+0

Maintenant, je ne comprends pas entièrement pourquoi cela a fonctionné et ce que j'ai essayé n'a pas fonctionné ... mais un petit morceau de connaissance à la fois lol. Merci encore. – Joshua

+0

Rendre votre deuxième morceau de code plus clair (pour moi), il semble que cela devrait fonctionner. –

0

Vous pouvez initialiser @target à zéro, donc quand vous venez pour le tester, s'il est nul, appelez find_by_shrunk et affectez le résultat à @target.

2

Cela devrait fonctionner:

if this_target = Target.find_by_shrunk(params[:shrunk]) 
    @target = this_target 
else 
    #do something else 
end 
1

essayer cette

something_else unless @target = Target.find_by_shrunk(params[:shrunk]) 

ou, si vous avez besoin

positif
do_something if @target = Target.find_by_shrunk(params[:shrunk]) 
Questions connexes