2011-03-17 11 views
13

對於我正在處理的項目,我需要實現對象版本控制。不幸的是,我需要保留每個對象的完整歷史記錄,所以像Papertrail這樣的單一表格解決方案很快就會變得無法管理。有我喜歡的Papertrail的功能,但是,我無法在每個模型的單獨表格(例如acts_as_versioned)的解決方案中找到它。存儲從兩個控制器和模型 Rails中的對象版本控制,像Papertrail,但是各個表格

  • 數據的元信息

    • 能力系列化所以模式更改不修改版本表
    • 強大的方法用於遍歷版本
    • 變化的責任
    • 自動跟蹤

    還有一些papertrail不具備的功能,這將是獎金:

    • 內置版本DIFF支持
    • 差,而不是完整版本

    我目前正在考慮分叉Papertrail使用單獨的表各型號,但想保存精力,如果有一個現有的解決方案。

    更新: 維斯塔版本默認使用一個表,而是通過爲每個模型的定製版本類和使用ActiveRecord的「set_table_name」的方法,我能夠爲每個模型創建單獨的表。 Vestal Versions也內置了差異支持,但它的界面並不像Papertrails那麼強大。它也缺乏協會支持。

    更新2: 作爲papertrail似乎是一個更活躍的項目我已經分叉的寶石和定製類支持類似於維斯塔版本現在允許定義每個模型單獨的表的能力增加。我的叉子在這裏,但我希望它很快就會被引入到主要的項目倉庫中。 https://github.com/benzittlau/paper_trail

  • +0

    爲什麼你需要每個型號單獨的表格?老派插件acts_as_versioned以這種方式工作。 – Unixmonkey 2011-03-19 23:29:17

    +0

    對於每個模型都需要單獨的表,因爲所有版本化對象的單個表將快速增長到不可管理的大小,尤其是當我期望經常讀取和寫入此表時。 – 2011-03-23 06:05:11

    回答

    11

    您可以指定自定義版本的子類:CLASS_NAME選項:

    class Post < ActiveRecord::Base 
        has_paper_trail :class_name => 'PostVersion' 
    end 
    
    class PostVersion < Version 
        # custom behaviour, e.g: 
        set_table_name :post_versions 
    end 
    

    這可以讓你每個模型的形式存儲在一個單獨的表,如果你創建了很多版本的,這是有用。

    +0

    我們是否真的需要使用set_table_name,因爲它是類中的默認派生表名稱? PostVersion => post_versions – gamov 2012-04-26 07:39:20

    +1

    確實如果你的類繼承AR :: Base,在這裏不是這樣。 – 2012-07-06 22:25:29

    +0

    在單表中已經有一堆歷史記錄後,我可以開始使用不同的表嗎? – holaSenor 2013-04-18 20:53:58

    0

    我一直在使用Vestal Versions,一個鐵軌寶石/插件,使用Memento模式創建一個歷史表,並將其保存在after_save的和after_destroy回調屬性的差異。

    它還會記錄它何時更改並增加版本號,以便您可以回滾到特定日期或時間的某個版本或某個版本。

    然後我就可以拉起一個對象,像這樣:

    @user = User.last 
    @user.versions.last.changes #=> {:name => ['Robert','Bob']} 
    

    我是一個相當大風扇。

    +0

    Vestal版本,如Papertrail,使用單個表來存儲它的版本化對象,所以不適合我的應用程序,如原始文章中所述。 – 2011-03-19 19:51:04