日期:2014-05-16  浏览次数:20452 次

mongoid没有的set_defaults rake

?

?#https://github.com/iamnader/mongoid/commit/ffb5a2b05202fe14e3b6b397382b02fcf402081f

?

?? def valid_mongo_type(t)

      [Array, BigDecimal, Boolean, Date, DateTime, Float, Hash, Integer, String, Symbol, Time, BSON::ObjectId].include?(t)
    end

    desc "Default existing document values"
    task :set_defaults => :environment do
      models = get_mongoid_models
      models.each do |m|
        # get fields that have defaults set
        fields_with_defaults = m.fields.select {|k,v| v.options.include?(:default)}
        fields_with_defaults.each do |f|
          field_name = f[0]
          default_value = f[1].options[:default]
          field_type = f[1].options[:type] || String # String is the default type

          # the default could be a new document, so we don't worry about those
          if valid_mongo_type(field_type)
            # update all the documents of the collection to set the default field if the field is not set
            result = Mongoid.master.collection(m.collection.name).update({field_name => {'$exists' => false}}, {'$set' => {field_name => default_value}}, :multi => true, :safe => true)

              puts "Updated #{result.first.first['n']} #{m.name} documents to use a default of: #{default_value}"

          end
        end
      end
    end
?