ActiveRecordのmergeは使える子

Pocket

mergeはmergeでもHashじゃなくてActiveRecord::SpawnMethodsのmergeなのです。

join先のテーブルの条件で絞り込みたい

例えばブログのエントリーの公開・非公開がいつでも切り替えられるとして、非公開になっているブログのコメントを抽出したいな、と思ったとします。

公開・非公開かはentriesテーブルのpublished_atカラムにDateTimeがセットされているかされていないかで分かるとすると、以下のようなコードになると思います。

でも、entries: { published_at: nil }の部分って、もう少し表現を変えられないかな?って思いますよねー! このコードの意味するところは「この記事は公開されていない、いわば下書きの状態である」と言いたいので、その通りにコードを書きたいですよね。

抽出条件に名前をつけるにはActiveRecordのNamed Scopeという機能を使います。つまりこういうことですね。

このscopeで定義した条件を利用するのに、ActiveRecord::SpawnMethods#mergeを使うことができます。mergeを使うとこんなコードになります。

scopeを利用しない場合はこんな風に書くこともできます。

空気読んで勝手にINNER JOINしてくれれば良いのですが、そうはいかないのでjoinsは必要です。

・・・と、こんな小ネタをまとめたActiveRecord大全なんかあれば良いのにな、と思う今日この頃でした。