u16suzuの blog

日々学んだことのメモブログです。

Mongoid gem の test の実行方法

ソースはこちら : https://github.com/mongodb/mongoid/tree/master/spec#running-mongoid-tests

$ git clone git@github.com:mongodb/mongoid.git

$ cd mongoid
$ git submodule init
$ git submodule update

# MongoDB を起動する
# 起動に失敗する場合は /tmp/mdb を作り直すとよい
$ mkdir /tmp/mdb
$ mongod --dbpath /tmp/mdb

# MongoDBが起動してるかチェック
$ ps aux | grep mongo
u16suzu          30089   0.1  0.5 411874576  76624 s000  S+    7:06PM   0:00.94 mongod --dbpath /tmp/mdb

# testを実行する. 以下で全てのテストが走る
# 失敗するときは bundle update を実行すればok
$ rake

# テスト単体を実行したい場合は以下でOK
$ be rspec ./spec/mongoid/association/macros_spec.rb:186
# MongoDBが too many open file エラーで死ぬ場合がある
$ ulimit -n 10000

mongoid の any_of と or の違い

any_of は、前の条件をそのまま残して、その後に or 条件で挿入してくれる。 or は、前の条件も全部ひっくるめた or 条件を生成する。

コード例

実験したバージョン

[57] pry(main)> Mongoid::VERSION
=> "7.3.5"
> User.where(age: 33).any_of({name: "hoge"}, {tel: "123"}).selector
=> {"age"=>33, "$or"=>[{"n"=>"hoge"}, {"t"=>"123"}]}

> User.where(age: 33).or({name: "hoge"}, {tel: "123"}).selector
=> {"$or"=>[{"age"=>33}, {"n"=>"hoge"}, {"t"=>"123"}]}

ドキュメントより

  • any_of

    Adds a disjunction of the arguments as an additional constraint to the criteria already existing in the receiver.

レシーバにすでに存在する criteria に、追加の制約 として引数の論理和を追加します。

  • or

    Creates a disjunction using $or from the existing criteria in the receiver and the provided arguments. This behavior (receiver becoming one of the disjunction operands) matches ActiveRecord's or behavior. Use any_of to add a disjunction of the arguments as an additional constraint to the criteria already existing in the receiver.

$or を使用して、レシーバ側の既存の criteria と指定された引数から論理和を作成します。 この動作 (レシーバーが論理和オペランドの 1 つになる) は、ActiveRecord の or の挙動と一致します。 レシーバ側にすでに存在する条件に対する追加の制約として引数の論理和を追加したい場合は any_of を使います。

mongoid の any_of と or の違い

any_of は、前の条件をそのまま残して、その後に or 条件で挿入してくれる。 or は、前の条件も全部ひっくるめた or 条件を生成する。

[54] pry(main)> User.where(age: 33).any_of( {name: "hoge"}  ,  {tel: "123"} )
=> #<Mongoid::Criteria
  selector: {"age"=>33, "$or"=>[{"n"=>"hoge"}, {"t"=>"123"}]}
  options:  {}
  class:    User
  embedded: false>

[55] pry(main)> User.where(age: 33).or( {name: "hoge"}  ,  {tel: "123"} )
=> #<Mongoid::Criteria
  selector: {"$or"=>[{"age"=>33}, {"n"=>"hoge"}, {"t"=>"123"}]}
  options:  {}
  class:    User
  embedded: false>

ドキュメントより

  • any_of

    Adds a disjunction of the arguments as an additional constraint to the criteria already existing in the receiver. レシーバにすでに存在する criteria に、追加の制約 として引数の論理和を追加します。

  • or Creates a disjunction using $or from the existing criteria in the receiver and the provided arguments. This behavior (receiver becoming one of the disjunction operands) matches ActiveRecord's or behavior. Use any_of to add a disjunction of the arguments as an additional constraint to the criteria already existing in the receiver.
    $or を使用して、レシーバ側の既存の criteria と指定された引数から論理和を作成します。 この動作 (レシーバーが論理和オペランドの 1 つになる) は、ActiveRecord の or の挙動と一致します。 レシーバ側にすでに存在する条件に対する追加の制約として引数の論理和を追加したい場合は any_of を使います。

RubyKaigi2023に参加してきた&Ruby東海のRe:bootに手を挙げた

5月11~13日に長野県松本市で開催されたRubyKaigi2023に参加してきた。 今回、一番注目していたセッションは sue445 さんのN+1をrubocopで見つけて修復までやってしまおうという発表でした。 今現職でのメインはMongoDBなのですが、今回の発表で使っているライブラリは対応していなかった残念。

speakerdeck.com

Official partyで名古屋から来ている方とお友達になったり、その流れで翌日Ruby東海をやっておられた松本さん(@Dominion525さん)にご相談をして、Ruby東海のRe:bootをさせていただくことにしました。3年前にcovid-9の影響で東京から家族と共に名古屋に引っ越してきて、なんやかんやあり、お仕事にも慣れて落ち着いてきた所で、仕事外の時間と空間でコードを書いたり、プログラムについておしゃべりする場が欲しくて、一晩考えて手を上げました。

松本市はコンパクトで美しい良い街でした。徒歩で行ける範囲におしゃれなカフェや、雑貨屋さん、美味しいお寿司やさんがありとても観光しやすい街でした。何よりも標高が高く、海もないため湿気がなくカラッとしていて涼しいです。東北生まれにはありがたい。

来年は沖縄開催となります。とても楽しみです。最後にRubyKaigi2023スタッフの皆様本当にお疲れ様でした!

今日読んだもの

github.com

rubocopのcopを全て有効にしています。 そのままだと全て落ちてしまうので、全てのRubyファイルの先頭に # rubocop:todo all をつけてチェックをしないようにしています。 あとは個別のファイルごとにrubocopに対応して # rubocop:todo all を削除していけば良いとのこと。

github.com

システムのread/write権限を持つユーザがmongodbのシステムコレクションのデータを変更できる件を指摘、修正しています。

今日かいたもの

github.com

WIPでmongoidにPRを出してみた。しかし、evergreenで許可を得ないとパッチを出せないみたいで止まっている。

今日読んだもの

Expand arrays in queries https://github.com/mongodb/mongoid/pull/5601

mongoidに対してActiveRecordの挙動に依存するサードパーティgemが動くようにするため、ARの挙動と同じくする提案がなされている。 変更内容は以下のように、要素が1個の配列が与えられたとき、自動で1個の要素に展開されるようになるというもの。

# 9.x behavior
Person.where(name: ['Kate']).selector # { 'name' => 'Kate' }

# 8.x behavior
Person.where(name: ['Kate']).selector # { 'name' => [ 'Kate' ] }

例えば、array typeのフィールドに対してのクエリが影響を受けてしまう。これはBC。 この変換を無効にするフラグ expand_single_element_arrays_in_query も用意されてはいる。 この変更は device が期待通りに動かないことに対する修正のようで、あまり入れて欲しくはない変更である。 https://jira.mongodb.org/browse/MONGOID-5554

この提案はまだ Draft の段階。

2022/11/8(wed)の日記

社内勉強会が50回目の開催だった

4月ごろに前任者の方から引き継いで、自分が社内のバックエンド勉強会を運営をしている。 私の開催分は数えてみると20回くらいだった。議事録を眺めてみると、運営の担当メンバーは何回か代替わりをしている。 毎回、これの発表をしてくれる人を探すのはひと苦労で、初めの頃はなかなかプレッシャーを感じていた。 でも、最近は慣れたもので、ちょっと気楽に運営できるようになった。 多分、他のエンジニアメンバーにリアルで会って親交を深めると、より、気楽になっていくのだろう。

あと、今日は rspecのdoubleの使い方を少し調べた。

今朝冬の匂いを感じた

今朝、ドアを開けたら乾いた空気の匂いを感じた。 どこかで焚き火をしているかのような、かすかに煙ったい匂いだった。 うちは住宅地の中なので焚き火などしているはずはない。 小学生の時のお祭りの記憶がふとよみがえった。

ランチにラーメンを食べに行った

普段あまり行かないラーメン屋に、ふらっと足が向いたので行ってみた。 昔ながらの中華そばが美味しかった。 家から少し離れているので、どうかな?と思って行っていなかったが、いざ自転車で行ってみると、結構余裕な時間で帰ってくることができた。 何事も、一度そのアクションにどれくらいの時間がかかるか?を計測できていると、次からの予定が立てやすくなる。見積もりの話だ。 これからは気軽にこのラーメン屋に行こう。