Rails
MongoDB
mongo

Rails5からMongoDBに接続する事始め

More than 1 year has passed since last update.

Mongoid 6.0.0activemodel ~> 5.0となり、Rails5で使えそうなので動かしてみた。

目標

任意のMongoDBに接続してドキュメントを保存する。

開発環境

MongoDBサーバーを用意する

Kitematicを起動してオフィシャルなDockerイメージmongoからコンテナを作成。

rails-mongo-1.png

コンテナを作成したらACCESS URLを確認。このアドレスにアプリケーションから接続します。

rails-mongo-2.png

Mongoidの導入

関連ドキュメント
- mongoid-installation

任意のRailsプロジェクトを作成したらGemfilemongoidを追加。

Gemfile
gem 'mongoid', '~> 6.0.0.rc0'

Mongoidの設定

設定ファイルはgenerateで生成。

console
$ rails g mongoid:config
Running via Spring preloader in process 11317
      create  config/mongoid.yml

hostsに用意したMongoDBサーバーのアドレスを指定します。

config/mongoid.yml
development:
  clients:
    default:
      database: first_mongo_development
      hosts:
        - 192.168.99.100:32769
      options:

Active Recordの代わりにMongoidを使用するのでORMの指定を変更しておく。

config/application.rb
module FirstMongo
  class Application < Rails::Application
    config.generators do |g|
      g.orm :mongoid
    end

    ...
  end
end

Modelの作成

関連ドキュメント
- storage

ORMを変更しているので素直にgenerateで作成。

console
$ rails g model Person
Running via Spring preloader in process 26135
      invoke  mongoid
      create    app/models/person.rb
      invoke    test_unit
      create      test/models/person_test.rb
      create      test/fixtures/persons.yml

生成したモデルにフィールドを追加しておく。

app/models/person.rb
class Person
  include Mongoid::Document

  field :first_name, type: String
  field :last_name, type: String
end

動作確認

関連ドキュメント
- mongoid-persistence
- mongoid-queries

適当にタスクを作成して…

console
$ rails g task query
Running via Spring preloader in process 12584
      create  lib/tasks/query.rake
lib/tasks/query.rake
namespace :query do
  task :create => :environment do
    p Person.create(first_name: 'Heinrich', last_name: 'Heine')
  end
  task :show => :environment do
    Person.where(last_name: 'Heine').each do |person|
      p person
    end
  end
  task :delete => :environment do
    Person.where(last_name: 'Heine').delete()
  end
end

実行。

console
$ rails query:create
#<Person _id: 57cbf4c2e5868071d580f8b4, first_name: "Heinrich", last_name: "Heine">
$ rails query:show
#<Person _id: 57cbf4c2e5868071d580f8b4, first_name: "Heinrich", last_name: "Heine">
$ rails query:delete
$ rails query:show
$ 

なんとなく動いてそうです。