2015-06-10 108 views
0

沒有STI(單表繼承),有沒有辦法檢查是否已創建或更新任何模型,並確定在模型上更改/更新哪個模型和哪些屬性?ActiveRecord創建,更新任何模型

即運行rails服務器的輸出顯示在數據庫上運行的所有HTTP流量和查詢。對於緩存失效的目的,我想寫一些代碼,需要我知道這一點。

我正在尋找after_create和after_update,但不是在任何一個模型上,我需要在創建之後和更新之後具有通用性,並且有能力確定創建或更新了哪個模型。

這可以在ActiveRecord中完成嗎?如果是這樣,怎麼樣?

回答

2

如果你不改變所有模型的邏輯,它不是一個通用鉤子,所以你不想在ActiveRecord::Base中這樣做。像這樣的鴨子打字很糟糕。

這聽起來像你有共同的行爲,並處理這將是一個模塊(或ActiveSupport::Concern)。

實施例從here改性(假設你正在運行的Rails 3+)

module MaintainAnInvariant 
    # common logic goes here 
    extend ActiveSupport::Concern 

    included do 
    after_save :maintain_invariant_i_care_about 
    end 

    def maintain_invariant_i_care_about 
    do_stuff_pending_various_logic 
    end 
end 

現在每個共享此邏輯會明確包括它類,添加語義值

class OneOfTheModelsWithThisLogic < ActiveRecord::Base 
    include MaintainAnInvariant 
end 

class AnotherModelWithCommonLogic < ActiveRecord::Base 
    include MaintainAnInvariant 
end 

至於其餘的答案,如何知道發生了什麼變化,你正在尋找ActiveModel::Dirty方法。這些允許你檢查你的型號有什麼變化:

person.name = 'Bill' 
person.name_changed? # => false 
person.name_change # => nil 
person.name = 'Bob' 
person.changed # => ["name"] 
person.changes # => {"name" => ["Bill", "Bob"]} 
+0

我怎樣才能確定哪個型號更新? – Noah

+0

您將代碼包含在模型文件本身中,因此它將成爲「that」模型,其中「that」表示模型正在更新的模型。我更新了我的示例,以清楚地說明你的'include'代碼在ActiveRecord模型中 – ABMagil

+0

如何知道'maintain_invariant_i_care_about'方法中的模型? – Noah

相關問題