2010-07-07 64 views
0

什麼是在rails中執行「find_or_create_all」的高效優雅方式?在Ruby on Rails中查找或創建多條記錄 - 「find_or_create_all」

考慮:
名= 「鮑勃」, 「約翰」, 「傑克」, 「希德」],
用戶表

需要:
用戶=「#用戶:0x3ae3a00「,」#用戶:0x3ae3938「,」#用戶:0x3ae3898「,」#用戶:0x3ae37f8「]

其中一個用戶只有當它不存在時創建。

的中間溶液 - [「#User:0x3ae3a00」,零,零,「#User:0x3ae37f8」]也將這樣,例如,如果只在用戶表中存在的第一和第四條目。

一種方法是使用find_all_by_name並使用散列映射回名稱數組中的條目,但我不知道在rails中是否有一種優雅而有效的方式。

回答

2

ar_extensions提供了一個很好的解決方案。 https://github.com/zdennis/ar-extensions

假設有問題的表中有一列具有唯一數據庫索引,則可以使用批量插入(如果在唯一列上沒有匹配項,則可以插入批量插入),如果匹配項上有匹配項,則跳過或更新行獨特的專欄。

在envycasts加載大型數據集涵蓋這種情況下http://envycasts.com/products/advanced-activerecord

+0

我想在rails中創建一個模型的多個實例,但我無法找到一個乾淨的方式來做到這一點。但是你的ar-extensions gem鏈接很有幫助。感謝Sid – blawzoo 2012-02-08 22:39:31

0

如果我理解並且想要獲取一組名稱並將其轉換爲一組用戶?

names = ["Bob","John","Jack","Sid"] 
users = names.map{|name| User.find_or_create_by_name(name)} 

這將返回一個用戶對象數組。

+0

感謝您的答覆,但問題是,如果數組長度爲1000,它將使1000個單獨的查詢到數據庫。 如果像這樣的事情每隔5分鐘在一個cron作業中運行,它就會變得效率低下。 製作單個查詢(即find_all_by_name)的問題是失去陣列中的位置。人們可以使用哈希映射回陣列中的位置,但我希望有一個高效和優雅的方式。 – Sid 2010-07-07 06:18:26

+0

如果訂單是隨機的,你想保持它在同一個隨機順序,我不知道一個好方法。如果有一些基於數據庫表的訂單,您可以使用User.find(:conditions => {:name => names},:order => column_name)''。或者在sort_by http://ruby-doc.org/core/classes/Enumerable.html#M003120之後。 – 2010-07-07 11:23:01

+0

我也會檢查你的數據庫文檔,看看你是否可以通過編寫你自己的SQL來做些什麼。 – 2010-07-07 11:23:56