使用Mongoid 3在mongodb中存储函数

Okt*_*tav 7 ruby-on-rails mongoid3

正如标题所暗示的那样.我无法找到与Mongoid 3相关的任何内容.我发现的东西只适用于mongoid那些没有使用的旧版本Moped.

我发现了这个并没有用:

def self.install_javascript
  getWeekJs = Rails.root.join("lib/javascript/getWeek.js")
  if collection.master['system.js'].find_one({'_id' => "getWeek"}).nil?
    collection.master.db.add_stored_function("getWeek", File.new(getWeekJs).read)
  end
end
Run Code Online (Sandbox Code Playgroud)

此方法会将getWeek函数添加到system.js集合中.

怎么能在mongoid 3中完成?

Okt*_*tav 5

搞定了!

代码:

class StoredProcedure
  include Mongoid::Document
  store_in collection: "system.js"

  field :_id, type: String, default: ""

  def self.test
    equalsJS = Rails.root.join("lib/assets/javascripts/equals.js")
    code = Moped::BSON::Code.new(File.new(equalsJS).read)
    unless where(id: "equals").first
      proc = new(value: code)
      proc._id = "equals"
      proc.save
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

说明:

我正在使用system.jsin mongoid,好像它是一个普通的集合.我只是添加新文档.

重要:

该值必须是一个Moped::BSON::Code实例,否则它将保存为字符串,因此无用.id必须是函数的名称.我无法在create语句中指定id,因此我添加了多个步骤.

只需将其添加到rake任务,以确保在部署后将所有必需的函数添加到mongo.