2016-11-17 24 views
1

什麼命令通過變更模型的版本,最徹底的方法?Rails的Papertrail版訂貨型號通過變更集DIFF

我跟蹤一個整數(考慮體重每週丟失例如量),我想,以顯示誰擁有最終用戶「最本週丟失」。

我已經成功地破解你見過在一起的最醜陋的片段,我包括在它下面。

我可以不相信有沒有一些巧妙的方法這一點。有什麼想法嗎?

@scoreboard ||= PaperTrail::Version.where(item_type: "WorkoutLog").map do |version| 
    if version.changeset['weight'] 
    first = version.changeset['weight'][0] 
    last = version.changeset['weight'][1] 

    next if first.nil? || last.nil? 

    diff = last - first 
    {diff: diff, id: version.item_id} 
    end 
end 
+0

是記錄重量變化每週一次?或者每週有多個記錄,你想要的是今天和一週前的差異? – guiniveretoo

+0

換句話說,因爲您使用體重變化作爲示例,您是否在一段時間內查詢多個變化並試圖找出現在和之後的差異,或者您是否在該時間段內查詢一個變化?人們可以在一週內多次輸入此值嗎? – guiniveretoo

+0

@guiniveretoo雖然它可能不是很清楚根據我的片斷,時間間隔並不重要。對於這個例子的目的,認爲這是一個每週更新,但所有的事情都是平等的,我只是想基於與最新版本的變更和之前的版本進行排序。 (我明顯有一個'object_changes'列)。合理? –

回答

0

停止使用PaperTrail作爲'差異'的主要跟蹤系統 - 使其成爲您系統中的一流數據庫對象。然後,它得到了很多簡單的查詢大多數失去了對象:

DeltaWeight.where(created_at: 7.days.ago..Time.now).order(:amount_changed) 

或在情況下,你只需要找到適合您的相關對象的最新變化:

DeltaWeight.order(:created_at).group(:user) 
+0

欣賞輸入。不幸的是,我不能「停止」並改變一切。最終Papertrail植根於一個比這個問題更大的生態系統,併爲幾個無關的挑戰進行優雅的工作。 –

+0

我不是說停止使用Papertrail ......我說停止使用它來解決這個問題。 – guiniveretoo