Ruby
RubyOnRails
RubyonRails4.0

Rails 4系 の ActiveRecord でnilもしくは以上以下の条件検索

始めに

私はRailsアプリのコード内にSQLベタ書きが嫌いです、Arelも嫌いです。
なぜならデータベース構造に依存したり、可読性が低下したりするからです。
(私のArel力が低いせいでもある)

やりたいこと

create_table "users" do |t|
  t.string   "name",                        limit: 255
  t.date     "birthday"
end

上記のテーブルでbirthdayがX日以降、もしくはNULLで絞り込みたい

SQLで書くなら

SELECT
  *
FROM
  users
WHERE
  users.date > X
  OR users.date IS NULL

これをActiveRecordでArelなどを使用せずに実現したい

※Rails4系で or は使用できません

答え

User.where(date: [nil, X..Float::INFINITY])

nilと区間を配列で渡してあげることで、or条件のような絞り込みができます。
配列は知ってましたが、nilや区間のように型が違ってても可能なんですね、まじ便利。

補足

Float::INFINITYは以下の記事で知りました。
参考: https://qiita.com/takuya0301/items/c80b8067109c0e884ea8
この記事がほぼ答えだったのですが、nilと配列にすることになかなか気付けず、ハマりました。

INFINITYは便利ですが、dateの区間にできるようには見えず、知らないとわかりにくいので、

UPPER_LIMIT_DATE = Float::INFINITY

のように説明変数ならぬ、説明定数にしたり、コメントを書いた方がいいかもしれません。
※実際にはDate型ではないので注意

Float::INFINITY
=> Infinity

蛇足

railsには、 Date::Infinity というクラスも存在していて、こちらはインスタンス化して使用するようです

他にもInfinity周りで初見殺しな挙動があったので、別の記事を書く予定です。