始めに
私は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周りで初見殺しな挙動があったので、別の記事を書く予定です。