2011-06-02 102 views
1

我的代碼看起來是這樣的,它的工作原理:捕捉真/假結果

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])被調用兩次。爲了避免這種情況,我想運行一次Target.find_by_shrunk(params[:shrunk]),捕獲true/false結果,然後在條件語句中使用該變量。我試過這樣做:

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

但不幸的是,這並沒有做我想做的事。

我該如何同時執行一個賦值,並以某種方式捕獲執行該賦值的真/假結果,因此我不必在連續兩次運行相同(昂貴的)代碼片段?

+0

怪異,第二個代碼塊應該工作。你可以寫一點清潔劑,但應該工作。 – robertodecurnex 2011-06-02 19:24:25

+0

在你的第二個代碼中,賦給'does_it_exist'是多餘的。它與'this_target'完全一樣。 – sawa 2011-06-02 19:34:37

+0

這是完全可能的,我有正確的想法,並在其他地方使某種語法錯誤,使它打破。重寫它看起來像裏卡多帕納焦的答案後,它的工作。正如我所說的,我是一個紅寶石小白,所以我認爲完全有可能在其他地方做了一些破壞它的事情。 – Joshua 2011-06-02 19:35:48

回答

4

你可以做

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

unless是一樣的if not。歸因歸還歸屬的值,如果它不同於nilfalse,則歸屬值爲true

+0

是的!這工作完美。非常感謝。你只是讓查詢運行速度快兩倍! – Joshua 2011-06-02 19:28:15

+0

現在,我不完全明白爲什麼這個工作,我試過的東西沒有工作......但一次一小塊知識大聲笑。再次感謝。 – Joshua 2011-06-02 19:30:32

+0

使你的第二個代碼塊更清晰(對我來說),它似乎應該工作。 – 2011-06-02 19:32:14

0

您可以將@target初始化爲零,因此當您來測試它時,如果它爲零,則調用find_by_shrunk並將結果賦值給@target。

2

這應該工作:

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

試試這個

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

或者,如果你需要積極

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