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

Ruby on rails 如何在rails中正确插入或更新记录?,ruby-on-rails,ruby,rails-activerecord,upsert,Ruby On Rails,Ruby,Rails Activerecord,Upsert,显然,我看到的答案是:“使用find\u或\u create\u by/initialize\u by()” 问题是:“是我,还是那些答案有点‘不完整’?”如果要求插入或更新,通常意味着记录应该是唯一的:不应该存在两个匹配的记录。根据这些答案,最终会在数据库中获得重复的行,或者偶尔会出现异常(如果使用唯一索引强制实现唯一性) 为什么没有人这样建议 begin Counter.create(name: '...', value: 1) rescue ActiveRecord::RecordNo

显然,我看到的答案是:“使用
find\u或\u create\u by
/
initialize\u by()

问题是:“是我,还是那些答案有点‘不完整’?”如果要求插入或更新,通常意味着记录应该是唯一的:不应该存在两个匹配的
记录。根据这些答案,最终会在数据库中获得重复的行,或者偶尔会出现异常(如果使用唯一索引强制实现唯一性)

为什么没有人这样建议

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

那是哪一个呢?我应该使用
find_还是
/
initialize_by
?还是应该依赖db的唯一索引?顺便说一句,我想不出有哪种情况需要进行插入或更新,并且可以使用重复的行。

因为
begin…rescue
不应该用于此

begin…rescue
用于出现错误情况时

下面是一个来自中国的例子

您的重复记录示例并不是一个真正的“错误”,因为每当提交重复数据时都可能发生错误


find\u或\u create\u by
优雅地处理这两种情况,没有“错误条件”的概念。

因为
begin…rescue
不应用于此

begin…rescue
用于出现错误情况时

下面是一个来自中国的例子

您的重复记录示例并不是一个真正的“错误”,因为每当提交重复数据时都可能发生错误


find\u或\u create\u by
优雅地处理这两种情况,没有“错误条件”的概念。

这是一个反问句吗?仅仅使用良好的验证不就满足了吗?请记住,rails背后的概念是约定优于配置。如果没有必要,为什么要把事情复杂化呢?@DavidHoelzer因为验证受竞争条件的影响,这就是为什么某些逻辑必须进入数据库的原因。@HolgerJust-Well,有点像。我希望有人能证明我错了。还没有发生。或者是对的。所以这不是一个修辞性的问题。这是一个修辞性的问题吗?仅仅使用好的验证不就满足了吗?请记住,rails背后的概念是约定优于配置。如果没有必要,为什么要把事情复杂化呢?@DavidHoelzer因为验证受竞争条件的影响,这就是为什么某些逻辑必须进入数据库的原因。@HolgerJust-Well,有点像。我希望有人能证明我错了。还没有发生。或者是对的。因此,这并不是一种修辞,但违反数据库中的唯一约束是一种错误。仅仅因为某件事在某个层面上是一个错误并不意味着它必须在所有层面上都是一个错误。顺便说一句,
find_或_create_by
只是
find_by(…)| | create(…)
,因此它仍然受到竞争条件的限制,甚至建议在需要唯一性的情况下将其包装在异常处理程序中。但是违反数据库中的唯一约束是一个错误。仅仅因为某件事在某个层面上是一个错误并不意味着它必须在所有层面上都是一个错误。顺便说一句,
find_或_create_by
只是
find_by(…)| | create(…)
,因此它仍然受竞争条件的约束,如果需要唯一性,甚至建议将其包装在异常处理程序中。
def inverse(x)  
  raise ArgumentError, 'Argument is not numeric' unless x.is_a? Numeric  
  1.0 / x  
end