限制mongoid中的版本属性

时间:2012-03-04 13:13:27

标签: ruby-on-rails ruby-on-rails-3 mongodb version mongoid

我正在使用Mongoid :: Versioning,除了我想防止多个字段被版本化之外,它的效果很好。

在文档中没有很多关于它的信息,所以我不知道该怎么做。

http://mongoid.org/docs/extras.html

class Person
  include Mongoid::Document
  include Mongoid::Versioning

  # keep at most 5 versions of a record
  max_versions 5
end

它们展示了如何完全跳过某个版本,而不是如何限制某些字段的版本化。

有什么想法吗?

更新

我发现这样的东西正在挖掘代码,但我不确定如何使用它。

https://github.com/mongoid/mongoid/blob/master/lib/mongoid/versioning.rb#L90

3 个答案:

答案 0 :(得分:4)

默认情况下,所有字段都有选项:versioned如果您不想要此版本,则可以传递false。例如,我想要名称版本但没有登录

class User
  include Mongoid::Document
  include Mongoid::Versioning

  field :name, :type => String
  field :login, :type => String, :versioned => false
end

您也可以在嵌入关联中传递:versioned选项。

您可以通过迭代文档上的.fields来覆盖此选项。

因此,在您的代码中,您可以通过创建一个小方法来添加避免在某些字段上进行版本化:

class User

  include Mongoid::Document
  include Mongoid::Versioning
  include Mongoid::Voteable

  field :name, :type => String
  field :login, :type => String

  def self.avoid_versioned(*unversioned_fields)
    unversioned_fields.each do |f|

      fe = self.fields[f.to_s]
      fe.options[:versioned] = false if fe

      re = self.relations[f.to_s]
      re[:versioned] = false if re

    end
  end
  avoid_versioned( :login, :votes )
end

答案 1 :(得分:2)

你可能会找到一种方法来做到这一点,但我建议你去看看这个宝石。

https://github.com/aq1018/mongoid-history

track_history   :on => [:title, :body],       # I want to track title and body fields only. Default is :all
                  :modifier_field => :modifier, # Adds "referened_in :modifier" to track who made the change. Default is :modifier
                  :version_field => :version,   # Adds "field :version, :type => Integer" to track current version. Default is :version
                  :track_create   =>  false,    # Do you want to track document creation? Default is false
                  :track_update   =>  true,     # Do you want to track document updates? Default is true
                  :track_destroy  =>  false,    # Do you want to track document destruction? Default is false

答案 2 :(得分:0)

您可以通过将持久性调用包装在无版本的块中来随时跳过版本控制。

class Person
  include Mongoid::Document
  include Mongoid::Versioning
end

person.versionless do |doc|
  doc.update_attributes(name: "Theodore")
end