如何在记录通常已存在时有效地使用first_or_initialize

时间:2013-10-13 04:30:07

标签: mysql sql ruby-on-rails activerecord

我正在试图弄清楚如何使用ActiveRecord来执行以下的伪代码:

rows_updated = UPDATE my_table SET my_column="abc" WHERE id=123
if rows_updated == 0 then INSERT INTO my_table (id, my_column) VALUES (123, "abc")

原因在于记录已经存在的大部分时间。我想保存SELECT似乎生成的额外first_or_create!查询。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

对于这种情况,也有不同的,更优雅的解决方案(从我的角度来看) 其中一个选项是使用替换命令而不是所有这些代码。

跑步:

REPLACE INTO my_table (id, my_column) VALUES (123, "abc")

这个解决方案在大多数情况下工作得很好,但如果你对这些代码有很高的负担,你应该考虑使用 INSERT .... ON DUPLICATE KEY UPDATE

答案 1 :(得分:0)

首先进行查找或初始化,以便如果id不在那里,它将创建对象。然后检查它是否是新的。如果新保存,则更新它。

obj= find_or_initialize_by_id(obj)
obj.new_record? ? prod.save! : *update the entry*

答案 2 :(得分:0)

我全都是高效数据库解决方案的全部,但是第一个查询应该采取类似1或2毫秒的内容,如果它看起来像神秘的效率低于更新,那部分是因为数据库可能需要物理读取才能访问它 - 然后更新将从预缓存中受益。

因此,除非此操作是一个可衡量的重要性能问题,否则我不会尝试优化它。