显然,我看到allthosequestions,其答案如下:“使用find_or_create_by
/initialize_by(<cols>)
”。如何在rails中正确插入或更新记录?
问题是:“只是我,还是那些答案有点'破'?”如果有人要求插入或更新,通常意味着记录应该是唯一的:没有两个记录匹配<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的独特索引?在附注中,我想不出任何人想要插入或更新和有重复行的情况。
这是一个修辞问题吗? –
简单地使用良好的验证不是满足吗?请记住,rails背后的概念是惯例而非配置。如果没有必要这么做,为什么会使事情复杂化? –
@DavidHoelzer因为验证受到竞争条件的限制,所以某些逻辑必须放在数据库中。 –