2013-10-13 22 views
1

我试图找出如何使用ActiveRecord执行以下伪代码:如何有效地使用first_or_initialize记录时通常已经存在

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") 

这样做的原因是大多数记录已经存在的时间。我想为自己节省first_or_create!似乎产生的多余SELECT查询。

任何想法?

回答

2

还有不同的,更好的解决方案(从我的观点来看),用于这种情况下 的选项之一是使用替换命令,而不是所有这些代码。

只需运行:

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

该解决方案适用于大多数情况下就好了,但如果你对这个PICE的代码非常高的负荷,你应该考虑使用 INSERT .... ON DUPLICATE KEY UPDATE

+0

Thx!以前没有看过这个命令。看起来很有希望。 –

0

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

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

我全部用于高效率的数据库解决方案和所有,但是第一个查询应该采取类似1或2毫秒的东西,并且如果它看起来比更新效率神秘地低效,它部分是因为数据库可能需要物理读取访问它 - 更新将从预缓存中受益。

所以除非这个操作是一个明显的性能问题,否则我不会尝试优化它。

相关问题