Edited at

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

More than 3 years have 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
$

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