我需要覆蓋rails(活動記錄)update_all
方法,以便它始終更新updated_at
字段。我應該如何去實現這個目標?覆蓋rails update_all方法
1
A
回答
4
將下面的代碼在一個文件/config/initializers/update_all_with_touch.rb
class ActiveRecord::Relation
def update_all_with_touch(updates, conditions = nil, options = {})
now = Time.now
# Inject the 'updated_at' column into the updates
case updates
when Hash; updates.merge!(updated_at: now)
when String; updates += ", updated_at = '#{now.to_s(:db)}'"
when Array; updates[0] += ', updated_at = ?'; updates << now
end
update_all_without_touch(updates, conditions, options)
end
alias_method_chain :update_all, :touch
end
,只要您使用update_all
它會自動添加參數:updated_at => Time.now
。
說明:
這個片段使用alias_method_chain
覆蓋的update_all
默認:
alias_method_chain :update_all, :touch
方法update_all
由該方法update_all_with_touch
代替我定義了,原來update_all
被重命名update_all_without_touch
。新方法修改upgrades
對象以注入更新updated_at
,然後再調用原始的update_all
。
1
您可以在模型覆蓋update_all方法:
def self.update_all(attr_hash) # override method
attr_hash[:updated_at] = Time.now.utc
super(attr_hash)
end
+0
我需要這種行爲在多個模型中,因此我正在尋找一種可以跨模型工作的方法。 –
+0
因此,添加一個ActiveRecord超類並將函數添加到那裏。然後它將適用於您的所有型號 – user2503775
相關問題
- 1. 覆蓋rails activerecord touch方法
- 2. Rails - 覆蓋別名方法
- 3. update_all與方法
- 4. spec for update_all方法在rails上的ruby
- 5. 覆蓋方法
- 6. 覆蓋方法
- 7. 覆蓋方法
- 8. 覆蓋方法
- 9. 覆蓋'+'方法
- 10. 覆蓋Rails中的寶石方法
- 11. Java方法覆蓋 - 「方法不會覆蓋超級方法...」
- 12. 覆蓋get方法
- 13. 覆蓋Uploadify方法
- 14. 覆蓋printf方法
- 15. C++方法覆蓋
- 16. VideoJS覆蓋方法
- 17. C++覆蓋方法
- 18. 覆蓋internalFrameClosing方法
- 19. 從覆蓋方法
- 20. 覆蓋/新方法
- 21. 覆蓋shouldAutorotateToInterfaceOrientation方法
- 22. Java。覆蓋方法
- 23. OnBackKeyPress覆蓋方法
- 24. eclipse覆蓋方法
- 25. Android方法覆蓋
- 26. Backbone.Marionette覆蓋方法
- 27. 覆蓋OnCreateOptionsMenu方法
- 28. rails update_all插值
- 29. Rails的update_all
- 30. 調用覆蓋方法,超類調用覆蓋方法
此解決方案的工作原理,但我不清楚這是如何工作。有什麼方法update_all_without_updated_at或update_all_with_updated_at?此外,代碼中使用了不同格式的update_all,因此這些更新可以是散列,或數組或字符串。我可以檢查類型併合並一個散列的updated_at參數,這是可行的,但是當它的數組或字符串呢? –
@ user523146我修改了片段來處理字符串和數組,並添加了一些解釋。更新文件並重新啓動服務器以查看更改。 – Baldrick
爲了澄清,我用'with_touch'替換了'with_updated_at'。 – Baldrick