2016-03-16 70 views
-2

我試圖讓總成本中被稱爲「upgrade_cost」我的領域之一,並將其​​存儲在一個變量名爲$ TUC試圖獲得一個總 - 紅寶石

def totalUpgradeCost 
    $e = Experience.all 
     $tuc = 0 
     (e.emf_assets).each do |i| 
     i.upgrade_cost += $tuc 
     end 
    return $tuc 
    end 

我得到了一些錯誤未定義的局部變量或方法`e',對於Ruby來說是新的。任何人幫助?

+0

use $ e.emf_assets – Dias

+3

爲什麼用'$'使用全局變量?很確定你不需要這個;失去'$'!請注意,Ruby不是* Perl或PHP ;-)(順便說一句,這也是你的錯誤)。 – Carpetsmoker

+0

好的謝謝:)現在我得到錯誤:未定義的方法'emf_assets'大聲笑 – chinm3

回答

0

什麼是ee.emf_assets?如果您的意思是$e,則不允許放棄$。在Ruby中,變量名開頭的$表示全局變量。如果你在這個函數之外還沒有使用$e,最好簡單地叫它e,這樣它在函數外部就看不到了。無論如何,你會得到一個錯誤,因爲$e引用全局,而e引用單獨的(未定義的)局部變量。

+0

感謝凱爾的回覆:) – chinm3

-2

這不是PHP。 $無處不在。您已將$與一個e一起使用,並留下了另一個空的,這就是錯誤的原因。

此代碼應工作:

def totalUpgradeCost 
    e = Experience.all 
    tuc = 0 
    e.emf_assets.each do |i| 
    tuc += i.upgrade_cost 
    end 

    return tuc 
end 

這是在較短的方式是可行的:

def totalUpgradeCost 
    e = Experience.all 
    e.emf_assets.inject(0) {|sum, i| sum += i.upgrade_cost} 
end 
+1

...爲功能編程引入一個誰甚至不能看兩個變量,並明白他們是不同的人。 – 7stud

+0

這是爲什麼downvoted?除了命名(total_upgrade_cost)這應該工作。 –

+0

'Experience.all.emf_assets'不太可能工作。 – Stefan

1

我假設emf_assets與經驗相關的(通過has_many)。這就是說我覺得有以下可能會爲你工作:

​​

請注意,這可能會爲experiencesemf_assets小的數字工作,但在下一步的表現將一些優化中受益。但我認爲目前優化已經超出了這個問題的範圍。您需要避免N + 1查詢問題,並且在數據庫中執行整個計算可能很有意義。

+0

@Stefan,ty :)我有一對多(exp>資產)。所以我得到錯誤無法強制到Fixnum(TypeError)。這不知怎的解決了這個問題all_experiences.each do | experience | experience.emf_assets.each do | asset | 如果asset.upgrade_cost =零 總+ = asset.upgrade_cost 其他 asset.upgrade_cost + = 0 結束 結束 結束 – chinm3

+0

它增加總成本現在很好:O! – chinm3

+0

謝謝! :)這將解決我的答案。我不知道有to_i。這是詮釋?我試圖通過做一個if語句來使事情複雜化。 – chinm3