1

我试图弄清楚如何使用 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!

有任何想法吗?

4

3 回答 3

2

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

赶紧跑:

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

此解决方案在大多数情况下都可以正常工作,但如果您对这段代码的负载非常高,您应该考虑使用 INSERT .... ON DUPLICATE KEY UPDATE

于 2013-10-13T05:12:52.927 回答
0

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

obj= find_or_initialize_by_id(obj)
obj.new_record? ? prod.save! : *update the entry*
于 2013-10-13T05:03:36.260 回答
0

我完全支持高效的数据库解决方案,但是第一个查询应该花费大约 1 或 2 毫秒,如果它看起来神秘地比更新效率低,部分原因是数据库可能需要一个物理读取来访问它——然后更新会从预缓存中受益。

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

于 2013-10-13T08:27:16.190 回答