2013-10-13 23 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毫秒的東西,並且如果它看起來比更新效率神祕地低效,它部分是因爲數據庫可能需要物理讀取訪問它 - 更新將從預緩存中受益。

所以除非這個操作是一個明顯的性能問題,否則我不會嘗試優化它。

相關問題