1. 写在前面

我逛ruby china的时候发现很多前辈 12 年左右就开始用Rails + MongoDB的组合了,但当我终于有一天要用到时候居然没有找到一篇教程= =!

我本来以为就和之前把PostgreSQL替换成MySQL差不多,装个驱动,然后database.yml配置改一下就可以用了,结果发现Active Record居然没支持MongoDB……

然后今天装服务器环境,下载比较慢,正好有点时间,遂写下这篇教程。

2. 安装依赖

依赖的话,就两个,一个是驱动,一个是ORM层,用来替换Active Record的。不过由于MongoDB是面向文档的数据库,所以这里更准确的名字叫ODM(对象文档映射)。

版本的话自己对照文档找合适的即可。

1
2
gem 'mongo', '~> 2.12', '>= 2.12.1'
gem 'mongoid', '~> 7.1', '>= 7.1.2'

3. 生成配置文件 & 修改 ORM 配置

安装完成之后需要生成MongoDB的配置文件:

1
rails g mongoid:config

执行过之后你会在你的config目录下看到一个mongoid.yml文件,打开之后就按照属性名和注释修改即可。

到这里其实已经可以使用了,当我们使用脚手架生成rails g model XXX attr1:string attr2:integer时会发现新生成的model文件是不太一样的,它大概就像下面这样:

1
2
3
4
5
6
7
8
9
10
11
class User
include Mongoid::Document
include Mongoid::Timestamps

field :uuid, type: String
field :account, type: String
field :user_name, type: String
field :password_hash, type: String
field :email, type: String
field :is_admin, type: Mongoid::Boolean
end

不过实测当你运行rails db:seed等命令的时候,Rails还是会去找Active Record。因此你还需要在config/appliction.rb文件中添加如下代码:

1
2
3
config.generators do |g|
g.orm :mongoid
end

然后就可以正常使用了。

4. 最后

试用了两天MongoDB体验还是相当好的,mongoid几乎就和Active Record一样,所以应用层的代码几乎没有太大的变化。

异常捕获需要根据实际情况替换成Mongoid模块下的异常。属性的话,mongoid似乎会把_idid当成同一个东西,因此如果需要一个单独维护的id的话,建议还是起其它名字比较好。

最后就是MongoDB到底是NoSQL,头一次在Rails里没有一条migrate文件,还真有点不习惯……