2015-01-06 66 views
2

我有一個項目的電子表格,我將其轉換爲CSV並使用自定義導入腳本導入到我的基於Rails的應用程序中。PaperTrail手動創建版本

電子表格包含每條記錄的一行,但某些行保存了先前行的不同版本。

導入CSV時,我目前使用「past_version」字段標記第二行,但我現在認爲,實現完整版本化gem將是更好的方法。

我一直在閱讀PaperTrail的文檔,它看起來非常完美,但是,我需要將某些行的版本創建爲我的導入腳本的一部分。這可以用PaperTrail完成嗎?

基本上我需要開始導入,比如記錄1,2,3,4,5被正常添加,然後記錄6實際上是更新版本的記錄2,所以我現在需要手動創建PaperTrail版本。

這可能嗎?

回答

1

如果有人遇到這個問題:這是可能的!您可以在任何PaperTrail型號上撥打電話touch_with_version,例如:mymodel.paper_trail.touch_with_version。它會爲你創建一個版本。

0

對於PaperTrail 4.0.0和Rails 4.2.0

我不得不手動創建我自己的版本,這樣我可以使用update_column方法(否則它不會觸發PaperTrail。

#instance method in model to generate new version and create object_changes 

    def generate_version!(object_attrs, changed_attrs) 
    object_changes_attrs = {} 
    changed_attrs.each do |k, v| 
     object_changes_attrs[k] = v 
    end 
    object_value = self.class.paper_trail_version_class.object_col_is_json? ? object_attrs : PaperTrail.serializer.dump(object_attrs) 
    object_changes_value = self.class.paper_trail_version_class.object_col_is_json? ? object_changes_attrs : PaperTrail.serializer.dump(object_changes_attrs) 
    data = { 
     event: 'update', # or any custom name you want 
     whodunnit: PaperTrail.whodunnit, 
     object: object_value, 
     object_changes: object_changes_value 
    } 
    send(self.class.versions_association_name).create! merge_metadata(data) 
    end 

然後在您的模型中,您可以將它稱爲任何想要通過的地方:(1)當前對象屬性的散列(更新前);以及(2)散列的屬性和更改

#some method where you do not otherwise trigger PaperTrail 

def my_method 
    old_updated_at = self.updated_at 
    new_updated_at = DateTime.now.utc 
    object_attrs = self.attributes 
    self.update_columns(prioritized: true, updated_at: new_updated_at) 
    self.generate_version!(object_attrs, { 'prioritized': [false, true], 'updated_at': [old_updated_at, new_updated_at] }) 
end