カクカクしかじか

技術的なアレコレ

mongoid

mongoidでパラメーターがtrue/falseであるに関わらずセットされているかで条件分岐したい場合

今回の問題 フラグを検索条件に含めていて、値がセットされていればfalse/trueに関わらず、検索条件に含めたいときに present? で判定してしまうと false が検索フラグに設定されていた場合に値がセットされているにも関わらず if文で false と判定されてし…

mongoidのindexの貼り方まとめ

はじめに mongoidでのindexの貼り方のアレコレをまとめてくれている記事がないので自分のためにまとめます。 通常のindex 自身のフィールドに対するindex ※ background: true は更新時のロックが掛からないようにするオプション index({特定のフィールド: 1,…

mongoidのアソシエーションの依存オプション

:delete モデルのコールバックを実行せずに子ドキュメントを削除する。 :destroy 子ドキュメントを破棄し、モデルコールバックを実行します。 :nullify 子ドキュメントの外部キーをnilで更新して子ドキュメントを孤立させる。 :restrict 子ドキュメントが存…

ActiveRecordでのあいまい検索(mongoidと比べた)

経緯 久々にActiveRecordを業務でいじることになり、あいまい検索の方法を忘れてたのでメモ。 ちなみにmongoidだとこんな感じで正規表現的に書ける。 Model.where(name: /hoge/).to_a 書き方 mongoidに慣れすぎててパッと分かんなかった... key = "Supreme" …

RailsでActiveRecord::Enumを使わずにそれっぽい機能を実装する方法

経緯 普段の業務でmongoidというActiveRecordとは異なるORM(正確にはODM)を使っています。 当たり前ですが、ActiveRecordを使用しないRailsアプリではActiveRecordの使用を前提としたRailsの機能を使用することが出来ません。 というわけで、ActiveRecord::E…

mongoidで値がセットされて変更されるフィールド値(save前)をコンソールで確認する方法

やり方 公式ドキュメントによるとこんな感じの書き方でフィールドの値の変更をコンソールで確認出来るみたいです。 user.name = "hoge" => "hoge" user.changed_attributes => {"name"=>"hoge"} saveされると消えるっぽい。 user.save user.changed_attribut…

mongoidのor条件クエリany_of

基本構文 そういえばmongoidでOR条件どうやるんだっけ? そんな私の今日のメモ Model.any_of({フィールド: 条件}, {フィールド: 条件}) 使用例 良い例が思い付かなかった... # クーポンが適用されていない or クーポンの期限が切れていない Coupon.any_of({a…

Mongoidで本番DBのslaveにアクセスするためのコード

mongoidに纏わる誰の役にも立たない内容 本番でコンソールに入ってスクリプトを打つときについ忘れがちですが、 データ更新を行わないスクリプトを実行する場合はslaveを見るように指定するのが肝要です。 slaveを見るために必要なコード ※ 以下の例では mon…

mongoidのModel.where(field: { '$exists' => true }はフィールドが存在したら無条件で値を取ってきてしまうのでnilチェックされないという落とし穴

前提 BlogモデルとUserモデルがある BlogはUserにbelogs_toの関係 Blogのデータに対してUserが存在するデータだけを検索したい場合 落とし穴 mongoidの Blog.where(user: { '$exists' => true } は フィールドが存在したら無条件で値を取ってきてしまうので…

mongoidへ送ったプルリクエストが無事マージされた話

概要 先日のブログで書いた内容の経過報告です。 fuqda.hatenablog.com PR送った結果 先日mongoidに送ったプルリクエストが無事にマージされました。 github.com 所感 今回マージされたリポジトリには明確なコントリビューションガイドは無かったのですが、…

mongoidのupdate_allにバグがあるかもしれない?

gemのバージョン mongoid 6.1.1 MongoDBのバージョン Docker使用 mongo:3.6.12 概要 一対多のモデルに対する update_all が正しく動いてなさそう... 雑な例 (実際のコードとは関係ありません) Orderモデルにpending(入金待ち)、complete(決済完了)とcancel(…

mongoidのtimeless.save関連のバグを見つけた備忘録

概要 mongoidには特定のインスタンスのtimestampを更新したくない時に、timestampだけ更新しないようにする仕組みがあります。 私は実務でActive Recordを使ったことがないので定かではないですが、Active Recordにも必ずあるはずです。 そのオプションを付…

MongoDBのODマッパーmongoidにプルリクエストを送ってみた

今回やったこと RailsからMongoDBを使うためのOD(Object Document)マッパーであるmongoidにプルリクエストを送りました。 github.com 概要 mongoidを使った時にrails g modelコマンドでデフォルトで生成されるファイルにはtimestampがincludeされないので、…

mongoidはデフォルトだとモデルにcreated_atとupdated_atが存在しないので追加する方法

問題 Railsでmongoidを使用した場合、デフォルトのままだと当たり前にあると思いがちな created_at と updated_at が存在しないモデルが生まれます。 今回はこれの追加方法について触れてみます。 解決法 モデルのファイルに include Mongoid::Timestamps を…

Docker環境のmongoidを使ったRailsアプリでDBに接続出来ないときの解決法

経緯 現場Railsのタスク管理アプリをDocker環境+mongoidで作っていて、タスクの保存画面を作成していたところ、タスクのcreateでエラーに遭遇しました。 発生したエラー Docker環境上でRailsのDB(MongoDB)に接続出来てなさそう... 発生環境 Docker for Mac …

Dockerでコンテナ内にbundle installされない問題の解決法

前提 こちらの記事はDockerに対して不慣れな人間が書いているので、そらそうやろ!という内容が含まれます。 それでも個人用メモとして放流します。 技術要素 Rails 5.2.2.1 Ruby 2.5.1 mongodb 4.0.6 Dockerを扱うディレクトリ構成 アプリディレクトリ/ Gem…

mongoidのfind_or_initialize_byメソッド

はじめに find_or_initialize_by メソッドを知らなかった自分用メモに投稿させて頂きます。 なお、mongoidのコンソールログは量が多いので割愛し、ActiveRecordの例の時だけコンソールの表示を記載してあります。 find_or_initialize_byとは? 存在したらそ…

Railsアプリでmongoidを使った場合の特定フィールドに対するユニークバリデーションの実装方法

概要 RailsでMongoDB用のORMとして mongoid というgemがあります。 ここではそれを使った場合のモデルのバリデーションについてまとめてみます。 注意 RDBで言うカラムのことをMongoDBではフィールドと呼びます。 後述するフィールドは頭の中でカラムと変換…

痒いところに手が届くmongoidの検索条件まとめ

はじめに 本記事は、mongoidでこういう検索条件で検索をしたいのだけど、どうやったらいいのか?という 痒いところに手が届くように、その他のmongoidの記事では触れていない部分に触れていきます。 サンプルが最初は少ないですが、順次更新していく予定です…