2014-02-24 21 views
1

我可以在不修补ActiveRecord或在Rails 4中执行原始SQL的情况下使用REPLACE吗? 我只想保存一个记录,只有当它的表中没有相应的数据。如何在Rails中使用MySQL的REPLACE语法

我知道find_or_create_by方法,但我猜这会产生双重查询,SELECT和INSERT。 如果两者之间存在另一个INSERT查询,它将会失败,对吧? 还是我担心得太多? (我正在使用的系统不是关键任务系统。)

+0

什么是你指的另一个INSERT查询?我想你需要提供一些关于你想要做什么的更多细节。 –

回答

1

REPLACE是SQL标准的MySQL扩展。

由于ActiveRecord试图尽可能地使数据库不可知,所以我不认为增加特定数据库的行为是一个优先事项......最后提到我发现有人要求它在2009 Forums

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

更换作品酷似INSERT,不同之处在于,如果一个老行的表具有相同的值作为一个主键或唯一索引的新行,旧的行之前被删除新行被插入。

find_or_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_or_create_by可以有一个竞争条件,如果你不使用它正确。你应该这样使用它(来自ActiveRecord Documentation):

begin 
    CreditAccount.find_or_create_by(user_id: user.id) 
rescue ActiveRecord::RecordNotUnique 
    retry 
end 
+0

raviolicode,非常感谢。作为一名Rails新手,我将使用find_or_create_by而不是REPLACE来坚持Rails方式。 并且也非常感谢您让我知道如何捕获UNIQUE约束异常并重试。 – chikaram