2014-11-06 67 views
0

我有一个使用Mongoid :: Versioning设置的Rails模型。Mongoid ::版本控制 - 删除一个版本

class Post 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    include Mongoid::Versioning 

    field :name, type: String 
end 

我想删除特定的旧版本。例如。

post = Post.create name: 'A' 
post.update_attributes name: 'B' 
post.update_attributes name: 'C' 
post.version #=> 3 
post.versions.count #=> 2 
first_version = post.versions.first #=> #<Post _id: , created_at: _, updated_at: _, version: 2, name: "B"> 

我想删除first_version,但是当我尝试将其删除..

first_version.delete 
post.versions.count #=> 1 
post.reload 
post.versions.count #=> 0 

..所有版本中被删除。

我试过用destroy来代替,试着运行一个块里面的代码传到post.versionless,没有用。我该怎么办?

UPDATE: 我已经得到它与Mongoid::Paranoia一起工作。但是,如果能够灵活使用Mongoid::Paranoia,那就太好了。

+0

您应该包括您所使用的Mongoid的版本。 FWIW Mongoid :: Versioning已被弃用,并将在4.0.0 – CubaLibre 2014-11-07 10:29:00

+0

Mongoid 4中被删除,但我正在通过mongoid版本控制gem(它带回已删除的功能)使用Versioning。 – Vighnesh 2014-11-17 20:18:49

回答

2

删除中间版本的概念不正确,破坏了版本控制的情况。如果你删除中间版本,那么你永远不知道它是故意的还是一些腐败。

尽管如此,如果你真的想要做到这一点,你应该改变为以下代码。

deleted = post.versions.first 
post.versions.delete(deleted) 

我不知道你为什么要做到这一点,虽然。如果您想确保您没有太多版本并想要清理,请使用max_versions类方法。

Post.max_versions(5) 

如果你想避免在某些情况下的版本,使用versionless

post.versionless(&:save) 
+0

我们有存储压缩附件的实际模型。用户需要能够上传这些压缩附件的多个版本,并且需要能够清除旧版本,如果他们混淆了模型。 我们并不担心维护渐进式差异,所以不关心历史因为我们删除了中间版本而变得糟糕。 – Vighnesh 2014-11-17 20:18:15

+0

@Vighnesh它听起来像你想维护一套文件,并允许删除和插入。为什么需要版本? – CubaLibre 2014-12-03 08:43:46