如何在Rails中使用MySQL的替换语法

如何在Rails中使用MySQL的替换语法,mysql,ruby-on-rails,Mysql,Ruby On Rails,在Rails 4中,我是否可以在不修补ActiveRecord或执行原始SQL的情况下使用REPLACE? 我只想在记录表中没有相应数据时保存记录 我知道find_或create_by method,但我猜这会生成两个查询,SELECT和INSERT。 如果在这两者之间有另一个INSERT查询,它将失败,对吗? 还是我太担心了?我正在使用的系统不是任务关键型系统。REPLACE是SQL标准的MySQL扩展 由于ActiveRecord尽可能不依赖数据库,我不认为添加特定数据库的行为是优先考虑的。

在Rails 4中,我是否可以在不修补ActiveRecord或执行原始SQL的情况下使用REPLACE? 我只想在记录表中没有相应数据时保存记录

我知道find_或create_by method,但我猜这会生成两个查询,SELECT和INSERT。 如果在这两者之间有另一个INSERT查询,它将失败,对吗? 还是我太担心了?我正在使用的系统不是任务关键型系统。

REPLACE是SQL标准的MySQL扩展

由于ActiveRecord尽可能不依赖数据库,我不认为添加特定数据库的行为是优先考虑的。。。我最后一次提到有人要它是在2009年

无论如何,我不确定使用REPLACE是否与使用find_或create_by相同。 从MySQL参考:

REPLACE的工作原理与INSERT完全相同,只是如果表中的一个旧行与主键或唯一索引的新行具有相同的值,则在插入新行之前会删除旧行

find_或create_by的行为不同,因为如果记录已经存在,它将保持记录的原样:

# File 'activerecord/lib/active_record/relation.rb', line 200

def find_or_create_by(attributes, &block)
  find_by(attributes) || create(attributes, &block)
end
另外,正如您所提到的,如果您没有正确使用,find_或create_by可能会有一个竞争条件。您应该从以下位置使用它:


您所指的另一个INSERT查询是什么?我认为您需要提供更多关于您尝试做什么的细节。raviolicode,非常感谢。作为Rails新手,我将坚持Rails的方式,使用find\u或create\u by代替REPLACE。也感谢您让我知道如何捕获唯一约束异常并重试。
begin
  CreditAccount.find_or_create_by(user_id: user.id)
rescue ActiveRecord::RecordNotUnique
  retry
end