我有這樣的,我有其中有一個JSON領域的產品表的情況下,我必須調用一個方法來更新。因此,有兩種方法調用內部update_all自對象中軌
Product.all.each do |pr|
pr.update_column(:boolean_tree, pr.change_boolean_tree)
end
沒有什麼不對的除了性能。爲了改善我們可以運行原始SQL性能。這肯定會正常工作,但不是以軌道方式。
我在想這是否可以使用update_all這種情況。任何想法 ?
我有這樣的,我有其中有一個JSON領域的產品表的情況下,我必須調用一個方法來更新。因此,有兩種方法調用內部update_all自對象中軌
Product.all.each do |pr|
pr.update_column(:boolean_tree, pr.change_boolean_tree)
end
沒有什麼不對的除了性能。爲了改善我們可以運行原始SQL性能。這肯定會正常工作,但不是以軌道方式。
我在想這是否可以使用update_all這種情況。任何想法 ?
據我所知,你將無法使用update_all
除非你嘗試更新了同樣內容的所有記錄。當數據庫中有很多產品時,指令Product.all
會在開始更新之前加載內存中的所有記錄。
我建議使用Activerecord的find_in_batches
方法(see doc)分批加載產品。
如果您編寫SQL片段,則可以使用具有不同內容的'update_all':例如'Model.update_all( 「FIELD1 = some_sql_function_on(FIELD2)」)' –
在這種情況下,似乎'change_boolean_tree'是紅寶石函數,而不是一個SQL函數。你的稱讚會使用ruby函數嗎? – Bustikiller
不,你必須編寫ruby方法作爲SQL函數來使用這種形式。鑑於'boolean_tree'是JSON數據非常困難。另一種選擇是像你所建議的那樣分批加載,在ruby中預先計算更新的值,然後使用SQL片段中的預計算值在'products.id'上構建'CASE'語句。真的很龐大,但它會起作用。 –
有沒有辦法從SQL調用紅寶石方法('change_boolean_tree')。您可以預先計算一個大型SQL查詢的價值觀 - 但這是容易批量'INSERT INTO'做的,但我相信,需要一個'UPDATE'一個巨大的'CASE'聲明。我會建議反對後者,除非它是一次性腳本。更復雜的是,列是JSON數據。如果您可以在JSON數據的原始SQL中編寫等效的'change_boolean_tree',那麼這是可行的。正如我所看到的那樣,這些是您數據構建的兩種選擇。 –
@AndrewSchwartz是的,我知道這種做法。正在考慮是否有任何辦法。 –
我不確定我瞭解您的意見。你有沒有嘗試過這兩種方法之一?結果是什麼?這些陳述本身在概念上很容易構建,它們非常粗糙,並且沒有提供標準的Rails保護或便利,因此很容易將某些東西搞砸。 –