railsでmongodbを使用しての開発メモ
mongodbを使用するときのおすすめgem
Gemfile
ruby '2.3.1' ~~~ gem 'mongoid', '~> 6.0.0' # mongoid 6のバージョンにまだ対応していないのでforkしています gem 'mongoid-enum', github: 'chocoken517/mongoid-enum'
mongoid
- ドキュメントがかなり充実しているので、基本困ることはない
configのinstall
rails g mongoid:config
config/mongoid.yml
が作成される
基本的な書き方
class Place include Mongoid::Document field :name, type: String field :prefecture, type: String end
type
はドキュメントを参考にしてください
index
class Place include Mongoid::Document field :name, type: String ~~~~ index(name: 1) end
- indexを複数つける場合
index(name: 1, prefecture: 1)
- ユニークにしたい場合
index({ name: 1 }, unique: true)
- ユニークだけどnilを許可したい場合
index({ name: 1 }, unique: true, sparse: true)
Timestamps
Mongoid::Timestamps
をinclude
すればcreated_at
とupdated_at
のfield
が追加されます
class Place include Mongoid::Document include Mongoid::Timestamps end
関連(埋め込み)
embeds_one
- ハッシュ
class Place include Mongoid::Document field :name, type: String field :prefecture, type: String embeds_one :image, cascade_callbacks: true end
class Image include Mongoid::Document field :name, type: String field :path, type: String embedded_in :place, inverse_of: :image end
登録
> Place.create(name: '東京駅', prefecture: '東京都', image: Image.new(name: 'ホーム', path: 'image/home.png'))
登録結果
{ name: "東京駅", prefecture: "東京都", image { name: "ホーム", path: "image/home.png" } }
embeds_many
- 配列
class Place include Mongoid::Document field :name, type: String field :prefecture, type: String embeds_many :images, cascade_callbacks: true end
class Image include Mongoid::Document field :name, type: String field :path, type: String embedded_in :place, inverse_of: :images end
登録
> place = Place.create(name: '東京駅', prefecture: '東京都') > place.images << Image.new(name: 'ホーム', path: 'image/home.png') > place.images << Image.new(name: 'ホーム2', path: 'image/home2.png') > place.save
登録結果
{ name: "東京駅", prefecture: "東京都", image [ { name: "ホーム", path: "image/home.png" }, { name: "ホーム2", path: "image/home2.png" } ] }
mongoid-enum
- mongoidでenumを使用したいとき
- mongoid-enumのReadmeに充実しているので、基本困ることはない
class Place include Mongoid::Document include Mongoid::Enum field :name, type: String enum :category, %i(station park hotel) end
使用方法
> place = Place.create(name: '東京駅', category: :station) > place.station? true > place.park? false > place.hotel! :hotel > Place.station Mongoid::Criteria # scope > Place::CATEGORY [:station, :park, :hotel]
Default value
enum :category, %i(c park hotel), default: :park
Multiple values
enum :categories, %i(station park hotel), multiple: true
> place = Place.new > place.categories << :park > place.categories << :hotel > place.save > place.hotel? true > place.station? false > place.categories [:park, :hotel]