2014-01-08 45 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