显然,我看到了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/