2015-01-06 67 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