我在 ruby on Rails 框架中用 ruby 编写。我无法理解假设的情况。 假设 get_date 函数返回一个包含大约 1000 万个元素的数组。每个元素包含字段:fk、名称、详细信息。 还有一个包含相同字段的表。它是部分填充的。 fk - 唯一索引字段。 我的任务是检查表中是否存在条目。如果没有记录,我必须创建一个。如果记录存在,我必须更新名称和详细信息字段,因为它们可能变得无关紧要。 我需要编写一些代码来尽可能少地加载数据库和服务器
我建议:
get_data.each do |item|
field = MyField.find_or_initialize_by_fk(item['fk'])
field.update_attributes(
{
:name => item['name'],
:detail => item['detail']
}
)
field.save
end
或
get_data.each do |item|
field = MyField.find_or_create_by_fk(item['fk'])
field.update_attributes(
{
:name => item['name'],
:detail => item['detail']
}
)
end
这两个哪个更好?
第一个版本会更好,因为它只执行两个查询,一个用于查找可能存在的记录,另一个用于更新现有记录或创建新记录。
当没有找到现有记录时,第二个版本将向数据库发出三个请求:一个尝试查找记录,第二个创建新记录,第三个更新新创建的记录。
upsert
,它仅在一个查询中插入新记录或更新现有记录:
get_data.each do |item|
MyField.upsert(
{ fk: item['fk'], name: item['name'], detail: item['detail'] },
on_duplicate: 'name = EXCLUDED.name, detail = EXCLUDED.detail',
unique_by: :fk
)
end