2013-09-29 95 views

回答

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

+0

此解決方案的工作原理,但我不清楚這是如何工作。有什麼方法update_all_without_updated_at或update_all_with_updated_at?此外,代碼中使用了不同格式的update_all,因此這些更新可以是散列,或數組或字符串。我可以檢查類型併合並一個散列的updated_at參數,這是可行的,但是當它的數組或字符串呢? –

+0

@ user523146我修改了片段來處理字符串和數組,並添加了一些解釋。更新文件並重新啓動服務器以查看更改。 – Baldrick

+0

爲了澄清,我用'with_touch'替換了'with_updated_at'。 – Baldrick

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