显然,我看到all those questions的答案如下:"使用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的独特索引?在旁注中,我无法想到任何人想要插入或更新和以及重复行的情况。
答案 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
优雅地处理这两种情况,没有“错误条件”的概念。