2012-10-04 44 views
1

我需要在訂單中存儲特定版本的模型。我打算使用paper_trailvestal_versions等版本控制寶石。我想要正確的版本自動加載訂單。belongs_to特定版本

理想情況下,我只需將對象存儲在order.update_attributes(:stuff => bought_stuff)中,並且順序會記住該東西的版本,以便隨後的加載將使order.reload.stuff仍然是訂單保存時的對象。

是否有寶石可以提供這樣的功能?我找不到一個。

否則,我該如何用ActiveRecord和版本控制寶石來實現?

回答

2

事實上,我幾乎可以達到什麼樣的我想PaperTrail這:

class Stuff < ActiveRecord::Base 
    has_paper_trail 
end 

class Order < ActiveRecord::Base 
    belongs_to :stuff 

    def stuff_with_version 
    stuff_without_version.version_at(created_at) if stuff_without_version 
    end 

    alias_method_chain :stuff, :version 
end 
0

不知道這必然是你最好的設計,但是你可以使用paper_trail這一點。只需在模型類的頂部添加宏方法'has_paper_trail',並且每當實例發生更改時,它的序列化副本就會在稱爲「版本」的表中創建,並與多態關係一起返回到實際模型。

假設您想要將某個'產品'的特定版本與訂單關聯起來,請首先向版本表添加關係 - 即向您的訂單添加'version_id'的遷移,然後設置關係如下:

class Order 
    belongs_to :version 

    def product 
    version 
    end 

    def product=(p) 
    version=p.versions.last 
    end 

end 

class Product 
    has_paper_trail 
end 

利用這一點,當你增加一個產品的訂單,這將涉及的以最新版本的產品,而不是。當您檢索產品時,它會提取該版本;即您創建訂單時的產品。讓關係以其他方式工作(即將產品與訂單相關聯)可能會更復雜,但這是一個開始。