LoginSignup
4
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-06-14

始めに

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

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0