限制Mongoid中版本属性的方法

3
我正在使用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个回答

4

所有字段默认选项为 :versioned 为 true。如果你不想启用版本控制,可以传递 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

我正在尝试与mongoid_voteable结合使用,所以我无法将“:versioned => false”传递给它。难道没有其他方法明确告诉它不要管某个嵌入对象吗?或者选择加入而不是退出? - ere
除非我在实现中漏掉了什么,否则它似乎不起作用。我得到了“Mongoid :: Relations :: Embedded :: Many:Class的undefined method `foreign_key_suffix'”错误。它仍然试图对:votes关联进行版本控制;-( - ere
在mongoid_voteable中,votes不是一个嵌入式的属性。你确定要使用它吗?https://github.com/jcoene/mongoid_voteable/blob/master/lib/mongoid_voteable.rb#L9 - shingara
我改进了我的 avoid_versioned 方法,以停止与关系有版本的内容。你需要在所有 voteable 调用之后才调用这个 avoid_versioned 方法。 - shingara
:versioned => false 设置为false对我有用。不知道为什么这样的内容没有在文档中提到。 - Nick
显示剩余5条评论

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

我喜欢它,但我想看看是否有另一种可能性,不需要使用另一个 gem? - ere

0

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

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

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

我在文档中看到了这个,但我不需要按记录来做。我需要永久地在特定字段上进行操作。 - ere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接