Монгоид без рельсов

Я играю с автономным рубиновым приложением и не могу настроить Mongoid 3.0.13 для работы.

Я столкнулся с несколькими примерами приложений с такими конфигурационными блоками, как:

Mongoid::Config.instance.from_hash({"database" => "oid"}) 

или

Mongoid.configure do |config|
 name = "mongoid_test_db"
 host = "localhost"
 port = 27017
 config.database = Mongo::Connection.new.db(name)
end

Это приводит к:

undefined method `database=' for Mongoid::Config:Module (NoMethodError)

Кажется, изменения конфигурации изменились недавно.

Я также пробовал:

Mongoid::Config.connect_to("sweet")

Но это ничего не делает.

Ответ 1

Под "автономным" я предполагаю, что вы имеете в виду не рельсы. Mongoid действительно обеспечивает простой способ сделать эту работу независимо от того, как вы ее используете.

  • Определите файл mongoid.yml с информацией о подключении к базе данных в нем, как обычно.
development:
  clients:
    default:
      database: mongoid
      hosts:
        - localhost:27017
  1. Удостоверьтесь, что в вашем приложении требуется Mongoid.
  2. Вызовите Mongoid.load!, чтобы Mongoid проанализировал ваш файл конфигурации и инициализировал себя.
require 'mongoid'
Mongoid.load!('/path/to/your/mongoid.yml')

Эту информацию можно найти также в разделе "Sinatra, Padrino и другие": http://mongoid.org/en/mongoid/docs/installation.html

Такой же подход применим и к не-webapps. Надеюсь, что это поможет.

Ответ 2

Попробуйте следующее:

prompt> ruby myapp.rb 
hello world

prompt> cat mongoid.yml 
development:
  sessions:
    default:
      database: myapp
      hosts:
        - localhost:27017

prompt> cat myapp.rb 
require 'mongoid'
Mongoid.load!("mongoid.yml", :development)
puts "hello world"

Ответ 3

Предыдущий ответ правильный, чтобы использовать Mongoid.load! если вы хотите загрузить из файла конфигурации mongoid. Я столкнулся с ситуацией, когда мне нужно было встроить конфигурацию Mongoid в другой файл конфигурации. Поэтому мне понадобился способ загрузить конфигурацию из хэша.

В > 3.1 вы сможете вызвать Mongoid.load_configuration (hash).

К сожалению, эта функция является частной в 3.0. Поэтому, настраивая общедоступный метод псевдонима перед загрузкой Mongoid, выполните следующие действия:

module Mongoid
  module Config
    def load_configuration_hash(settings)
      load_configuration(settings)
    end
  end
end

Убедитесь, что этот код вызывается перед требованием 'mongoid'. Теперь вы можете вызвать Mongoid.load_configuration_hash (хэш).

Ответ 4

Вы можете подтвердить, что вы можете создать базу данных, добавить коллекцию в базу данных и добавить документы в коллекцию непосредственно из IRB:

$ rvm use 2.4.1

$ rvm-prompt
$ ruby-2.4.1

$ rvm gemset create mongoid_test
$ rvm use @mongoid_test

$ gem install mongoid

$ gem list | grep mongoid
$ mongoid (7.0.2)

$ rvm-prompt
$ [email protected]_test

$ irb
> require 'mongoid'
 => true

> Mongoid.load!('mongoid.yml', :development)
 => {"clients"=>{"default"=>{"database"=>"mongoid_test", "hosts"=>["localhost:27017"]}}} 

> class LineItem
   include Mongoid::Document
   include Mongoid::Attributes::Dynamic
 end

> item = LineItem.new
> item['cost'] = 12.00
> item['quantity'] = 3
> item['name'] = 'Protein Bars'
> item.save!
 => true 
> LineItem.all.size
 => 1 
> i = LineItem.first
 => #<LineItem _id: 5c552b8d496a9d0828b374b5, cost: 12.0, quantity: 3, name: "Protein Bars"> 
> i.fields.keys
 => ["_id"] 
i.inspect_dynamic_fields
 => ["cost: 12.0", "quantity: 3", "name: \"Protein Bars\""] 

Откройте оболочку MongoDB и убедитесь, что ваши данные есть:

$ mongo
> show dbs
admin
config
local
mongoid_test

> use mongoid_test
switched to db mongoid_test
> show collections
line_items
> db.line_items.find({ cost: 12.0, quantity: 3, name: 'Protein Bars'}, {_id: 0})
{ "cost" : 12, "quantity" : 3, "name" : "Protein Bars" }

Прямо вперед, гибкий и, ну, довольно динамичный.