要在Rake任务curretnyl中填充一些示例数据,我有以下方法:
def create_population_summaries
PopulationSummary.where(year: 2009).first_or_create(member_count: 12, organization_id: 1)
PopulationSummary.where(year: 2010).first_or_create(member_count: 5, organization_id: 1)
PopulationSummary.where(year: 2011).first_or_create(member_count: 99, organization_id: 1)
PopulationSummary.where(year: 2008).first_or_create(member_count: 52, organization_id: 1)
PopulationSummary.where(year: 2012).first_or_create(member_count: 30, organization_id: 1)
PopulationSummary.where(year: 2013).first_or_create(member_count: 25, organization_id: 1)
PopulationSummary.where(year: 2008).first_or_create(member_count: 46, organization_id: 1)
end
所以这意味着有一个PopulationSummary表包含像
这样的列member_count
year
organization_id
我们用老板的数据填充了他们!给了我。
现在我想以一种方式重构它,它使用一些Ruby结构,如散列,数组,甚至散列数组等...... 这样重构我的方法后 NOT 在方法中包含那些手工输入的数据和那些手工输入的数据应该来自那个Ruby结构,哈希等...仍然在方法中我可以手工输入数据库的字段名称,比如年份,member_count等...但是我想从ruby数据结构中读取的值...
您如何建议编写该数据结构?
答案 0 :(得分:1)
data = [{'year'=>2009, 'members'=>12}, {'year'=>2010, 'members'=>5}....]
然后循环
data.each do |d|
PopulationSummary.where(year: d['year']).first_or_create(member_count: d['members'], organization_id: 1)
end
答案 1 :(得分:1)
如下:
DATA = [[ 2009, 12, 1],
[ 2010, 5, 1],
... ]
DATA.each do |d|
PopulationSummary.where(year: d[0]).first_or_create(member_count: d[1], organization_id: d[2])
end
答案 2 :(得分:1)
出于好奇,你可以完全区分元编程(业务规则,来自老板)和人口本身:
data = [ {
'year'=>2009,'members'=>12,'organization_id'=>1
}, {
'year'=>2010,'members'=>5,'organization_id'=>1
}, {
…
} ]
然后填充:
data.each do |d|
d.inject (PopulationSummary) do |rec, val|
rec.where val
end.first_or_create
end
但是,在老板带来一部分新数据的几个月后,我担心你会讨厌这个暗示。