ruby-on-rails - 如果存在则更新否则创建。无论哪种情况都返回记录

标签 ruby-on-rails ruby-on-rails-3

给定 guidvalue。如果具有该 guid 的记录存在,则更新其 value。否则,使用该 guidvalue 创建一个新记录。无论哪种情况,都返回记录,以便我可以获得它的主键 id

如何做到这一点:

  • 尽可能少的数据库查询
  • 尽可能少的代码

最佳答案

最简单的大概就是

object = Model.find_or_initialize_by_guid(guid)
object.update_attributes :value => value

它总是执行 2 个查询(一个查找和一个插入/更新)

如果您提前知道碰撞不太可能发生,您可以这样做

begin
  Model.create(:guid => guid, :value => value)
rescue ActiveRecord::RecordNotUnique
  # find and update existing record
end

这需要 guid 列上的唯一索引。它在更新案例中需要 3 个查询,但在创建案例中只需要 1 个查询。

这一切都假设我们在谈论 SQL - 其他数据存储,例如 mongodb,具有 upsert(更新或插入)操作的概念

关于ruby-on-rails - 如果存在则更新否则创建。无论哪种情况都返回记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10966958/

相关文章:

javascript - 无法将 unicode 字符添加到 js.erb 文件

ruby-on-rails - 为什么我可以将随机代码添加到我的 Ruby 类定义中?

mysql - 502 错误 nginx + ruby​​ on rails 应用程序

linux - 有没有办法让 rails-footnotes gem 在 Linux 的 Rails 3 上运行?

ruby-on-rails - 如何在rails中获取simple_form的动态id

python - 概述解决方案堆栈

mysql - Rails mysql 删除重复的元组

javascript - 如何测试在提交表单之前选中所有单选按钮/复选框

ruby-on-rails - 注册#create 中发生 ActiveRecord::RecordNotUnique 为什么?

ruby-on-rails - 通过 Capistrano 任务启动具有/特定队列的多个延迟作业工作人员