ruby-on-rails - 如何在 Rails 中正确插入或更新记录?

标签 ruby-on-rails ruby rails-activerecord upsert

显然,我看到了all those questions答案如下:“使用 find_or_create_by/initialize_by(<cols>) 。”

问题是:“这只是我的问题,还是那些答案有点‘破烂’?”如果有人要求插入或更新,通常意味着记录应该是唯一的:没有两条匹配 <cols> 的记录。应该存在。按照这些答案,最终会在数据库中得到重复的行,或者偶尔会出现异常(如果使用唯一索引强制执行唯一性)。

为什么没有人建议这样做?

begin
  Counter.create(name: '...', value: 1)
rescue ActiveRecord::RecordNotUnique
  Counter.where(name: '...').update_all('value = value + 1')
end

那是什么?我应该和 find_or_create_by 一起去吗?/initialize_by ?还是我应该依赖数据库的唯一索引?附带一提,我想不出任何情况下有人想要插入或更新 and 可以接受重复行。

最佳答案

因为 begin...rescue 不应该用于此目的。

begin...rescue 用于发生错误情况时。

这是来自 Ruby Learning 的示例.

def inverse(x)  
  raise ArgumentError, 'Argument is not numeric' unless x.is_a? Numeric  
  1.0 / x  
end

您的重复记录示例并不是真正的“错误”,因为只要提交重复数据,它就会发生。

find_or_create_by 优雅地处理了这两种情况,没有“错误条件”的概念。

关于ruby-on-rails - 如何在 Rails 中正确插入或更新记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089111/

相关文章:

ruby-on-rails - 工厂女孩似乎不喜欢 acts_as_singleton

ruby-on-rails - 如何通过特定字段对 has_many 进行排序

ruby-on-rails - 如何重写find_by方法然后调用activerecord中的原始方法

ruby-on-rails - 模型 belongs_to eiher/or more than one models

ruby-on-rails - ActiveRecord 和 ActiveRecord::Relation 对象之间的区别

ruby-on-rails - 在 ruby​​ 中存储可解密密码的安全方法

使用 Hpricot 进行 Ruby Web API 抓取/错误处理

ruby-on-rails - 集成到 Rails 中的票务系统

ruby-on-rails - 主机名与服务器证书不匹配-无法发送电子邮件

ruby-on-rails - 如何在 Ruby on Rails 中单击按钮更改值