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

时间:2015-05-06 22:59:52

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

显然,我看到all those questions的答案如下:&#34;使用find_or_create_by / initialize_by(<cols>)。&#34;

问题是:&#34;它只是我,还是那些答案有点被打破?&#39;?&#34;如果要求插入或更新,通常意味着记录应该是唯一的:不应存在两个匹配<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吗?或者我应该依赖db的独特索引?在旁注中,我无法想到任何人想要插入或更新以及重复行的情况。

1 个答案:

答案 0 :(得分:-1)

因为不应该使用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优雅地处理这两种情况,没有“错误条件”的概念。