2013-02-13 70 views
2

我有一種情況,我需要使用所有模型的updated_at字段來創建同步功能。但是對於用戶模式,updated_at字段在用戶每次登錄時都會被修改。更糟糕的是,當設備使用用戶的憑據登錄以同步數據時,updated_at字段只是在同步開始前被修改。防止在使用設計器登錄時修改用戶中的updated_at字段

所以,我的問題是,有沒有一種方法,我們可以停止設計更新updated_at字段時,用戶登錄?

+0

你有沒有想過找出解決方案? ( – fluxsaas 2013-05-02 08:52:10

+0

@fixusaas No ..我不得不改變我的同步邏輯 – 2013-05-03 06:18:10

回答

0

您可以在模型中添加另一列並更新日期時間,而不是嘗試更改updated_at的工作方式。

否則,你將需要改變設計做一些事情,如:

User.record_timestamps = false 
# devise save/update action 
User.record_timestamps = true 
+0

我已經嘗試了第二種方法,但它設計了什麼改變updated_at。我無法找到什麼控制器或方法來重寫添加這個。 – 2013-02-13 07:14:21

6

這裏就是我所做的:重寫should_record_timestamps?方法在devise字段更新時不會更改updated_at列。 這是代碼,它處理Devise :: Trackable和Rememberable。

def should_record_timestamps? 
    (self.changes.keys.map(&:to_sym) - (Devise::Models::Trackable.required_fields(nil) + [:remember_token, :remember_created_at])).present? && super 
    end 

這是當。

2

用戶登錄設計已經改變沒有無效緩存的好方法,所以這個問題值得更新的答案。

在我的用戶模型中,我覆蓋了updated_tracked_fields!。這自從May 21, 2014 (v. 3.3.0)以來一直在。

def update_tracked_fields!(request) 
    update_tracked_fields(request) 
    update_attrs = changes.each_with_object({}) do |(key, value), object| 
    object[key] = value[1] 
    end 
    update(update_attrs) 
end 

update方法是用來代替save因爲它會自動跳過驗證並更新updated_at列,我修改了update_attrs因爲update需要爲需要更新的所有列的哈希值。

相關問題