2014-01-08 46 views
-1

我正在構建一個Rails應用程序,每次添加某個人時都需要更新管理人員的總計。將總數更新爲我的方法看起來非常糟糕,有很多重複正在進行,可以通過一些元編程來解決。所以我有被稱爲上before_save稱爲私有方法update_totalsRuby動態構建和分配變量

因此,我們將其歸類這樣有四場比賽,非洲,有色,印第安人和白人有三種管理人員高級,中級和初級的,然後很明顯2種性別男性和女性。我需要能夠分配三個可能的變體,所以我最終得到了這樣的結果。

self.number_of_african_female_senior_managers = managers.native.african.female.senior.count 
self.number_of_african_male_senior_managers = managers.native.african.male.senior.count 
self.number_of_african_female_middle_managers = managers.native.african.female.middle.count 
self.number_of_african_male_middle_managers = managers.native.african.male.middle.count 
self.number_of_african_female_junior_managers = managers.native.african.female.junior.count 
self.number_of_african_male_junior_managers = managers.native.african.male.junior.count 

我需要爲每場比賽做到這一點。所以我想動態構建它們,然後讓它們分配。

因此,像這樣:

["african", "indian", "coloured", "white"].each do |race| 
    ["senior","middle","junior"].each do |management_type| 
    ["male","Female"].each do |gender| 
     "number_of_#{race}_#{gender}_#{management_type}_managers" = managers.native.race.gender.management_type.count 
    end 
    end 
end 

但是,這將返回字符串並不算分配變量。我看到有一個define_method方法可以動態構建方法,但看起來像你不得不在構造函數in this example之外調用它,並且我看到你可以使用Object#send這樣的example,但是我無法看到在這種情況下工作。

這是一個很好的紅寶石實踐?它增加了一點複雜性,但刪除了大量的DRY代碼。

+0

你的問題看起來非常糟糕有很多句子從低檔案開始,沒有適當的功能來完成,可以解決一點關心尊重任何人可能會花時間閱讀和回答你的問題 – sawa

+0

有一個像你的幾個問題:http://stackoverflow.com/questions/17842765/how-do-i-dynamically-create-a-local-variable-in-ruby ...等 – AndreDurao

+0

對不起,如果我的標點符號冒犯了你Sawa 。 AndreDurao這個問題對我來說毫無意義。我將在eval上查找文檔。 – TheLegend

回答

1

這是一個很好的紅寶石實踐?

DRY是一個很好的做法紅寶石,所以回答你的問題是:是

關於你的代碼,你可能會在這種情況下使用send

self.send("number_of_#{race}_#{gender}_#{management_type}_managers=", managers.send(native).send(race).send(gender).send(management_type).count

這仍然看起來很醜陋給我。我有點自問,爲什麼那個數據結構太瘋狂了。你爲什麼不在這裏使用簡單的哈希結構?

+0

感謝您的答案。我同意它不是非常漂亮的代碼。寫這篇文章的人不久就回來了。我認爲它是一個超級重構的時代。 – TheLegend