2012-04-04 75 views
2

我一直在想,假設我有一個模型,其中的每個實例都依賴於其他實例中的相同屬性。最好的例子就是列表中項目的訂單屬性。在before_update中更新模型

如果您同時擁有該項目的舊值和新值,那麼更新其餘項目的訂單屬性的最佳位置將位於before_update回調方法中。

但現在只要你更新列表中的其他項目的回調將被再次調用,並再次...

我在尋找解決這個優雅的方式。

我聽說過:update_without_callbacks方法,但我不想使用私有方法,而且我覺得添加額外的屬性是不必要的。

有什麼好主意嗎?提前致謝!

+0

數據庫觸發器可以接受嗎?這不是一個活動記錄解決方案,但它可能是最高性能和可靠的。 – Brandan 2012-04-04 18:23:30

回答

1

一種方法是使用update_all來批量設置所有其他項目的順序。

這樣你就可以有效地限制查詢的數量到一個,並防止任何回調被觸發。

https://github.com/rails/rails/blob/83e42d52e37a33682fcac856330fd5d06e5a529c/activerecord/lib/active_record/relation.rb#L274

+0

當一組項目(例如在所有其他項目中遞增一個整數)的變化相同時,此方法可以很好地工作,但如果變化發生變化,則需要更多的努力。感謝你的回答! – hananamar 2012-04-06 11:02:46

1

我覺得你有做這類跨項更新的建議你沒有正確概念化你的問題的事實。爲什麼不創建具有訂單屬性的List模型,然後在List模型和Item模型之間創建一對多關係。這樣,只有一個地方可以更新訂購信息,不需要複雜而脆弱的回調。