gpt4 book ai didi

mysql - Ruby/Rails 使用重复数据更新现有记录

转载 作者:行者123 更新时间:2023-11-29 12:34:25 31 4
gpt4 key购买 nike

我有一个监控技能发展的应用程序,它有许多培训计划,每个培训计划都有许多参与者。

用户每个月都可以单独添加参与者或通过 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)

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

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

我们使用 ID 作为唯一的可选标识符,因此如果它们没有 id,那么我们假设它们始终是新的。 Rails 中是否有任何东西可以用来执行此操作?

我计划做的是在保存之前,我会查找是否有提供 ID 的参与者,如果有,则提取该记录并将两者相加并保存记录。我必须测试它的效率,但我不认为它非常有效。

任何帮助或阅读都会很棒。我在 SO 上发现了一些关于查找重复记录的查询,但它是在全局范围内进行的,仅查找重复记录就可能需要长达 60 秒的时间,更不用说更新它了。我们的参与者表中有近 2500 万参与者,其中 65 万是重复的。

最佳答案

您可以使用 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

因此,如果找到参与者,数据就会更新,否则会更新行

关于mysql - Ruby/Rails 使用重复数据更新现有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27018901/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com