Ruby / Rails用重复的数据更新现有记录

时间:2014-11-19 14:07:26

标签: mysql ruby-on-rails ruby

我有一个监控技能发展的应用程序,它有许多training_programs,每个training_program都有很多参与者。

用户每个月都可以单独添加参与者,也可以通过Excel上传。我现在的情况是人们上传每周修改的电子表格,这会复制系统中的参与者。

其中一个字段是times_trained,他们期望的是每次添加参与者(如果存在)然后将所有属性加在一起。

Training_program.participants.first 
  => { id: 33, name: "rob", id: 123456789, times_trained: 3, amount_spent: 65000 }

所以如果我们想添加

Participant.new(name: "rob", id: 123456789, times_trained: 2, amount_spent: 25)

不应添加新参与者,而应更新现有参与者。所以,如果我们想再次找到抢劫,我们可以说

Participant.find(33) 
  => { id: 33, name: "rob", id: 123456789, times_trained: 5, amount_spent: 65025}

我们使用ID作为唯一的可选标识符,因此如果他们没有ID,那么我们假设他们总是新的。有什么东西可以用来做这个吗?

我计划做的是在保存之前我会发现是否有参与者提供了id,如果是,那么拉出该记录并将其中的两个加在一起并保存记录。我必须测试它的效率,但我不认为它非常有效。

任何帮助或阅读都会很棒。我已经找到了一些有关查找重复记录的查询,但是它在全球范围内,并且它可能需要长达60秒才能找到重复记录而不记得更新它。参与者表中有近2500万参与者,65万是重复参与者。

1 个答案:

答案 0 :(得分:1)

你可以使用find_or_initialize_by并写下这样的东西:

excel_row =  { id: 33, name: "rob", id: 123456789, times_trained: 3, amount_spent: 65000 }
participant = Participant.find_or_initialize_by(id: excel_row[:id])
participant.name = excel_row[:name] #Set this row default 0 in your db
participant. amount_spent += excel_row[:name]) #Set this row default 0 in your db
participant.save

因此,如果找到参与者,则更新数据,在另一种情况下,更新行