ограничение версии атрибутов в монгоиде - PullRequest
3 голосов
/ 04 марта 2012

Я использую 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

Они показывают, как вообще пропустить версию, но не как ограничить определенные поля от версионности.

Есть идеи?

UPDATE

Я нашел что-то вроде этого, копаясь в коде, но я не уверен, как его использовать.

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

Ответы [ 3 ]

4 голосов
/ 08 марта 2012

Все поля имеют параметр :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
2 голосов
/ 04 марта 2012

Возможно, вы найдете способ сделать это, но я бы посоветовал вместо этого проверить этот камень.

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
0 голосов
/ 09 марта 2012

Вы можете пропустить управление версиями в любой момент времени, поместив постоянный вызов в блок без версии.

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

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