Open6
railsのsqlで条件分岐書きたい時

スコープを使うと、xxだったらyyが書きやすい
class Order < ApplicationRecord
scope :created_before, ->(time) { where(created_at: ...time) if time.present? }
end

?
使えば、第二引数に普通にrubyで条件分岐書けるから便利かも
Book.where("title = ?", params[:title])

これも良さげ
@items = User.where(public_flag: true).where.if(params[:filter] == "今日", created_at: Date.today)

これも良さげ
# 始端無し
User.where(activated_on: ..Date.new(2022,12,31)).to_sql
=> "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"activated_on\" <= '2022-12-31'"
# 終端無し
User.where(activated_on: Date.new(2022,1,1)..).to_sql

ActiveRecordの検索系のメソッドには即SQLが発行されるのと遅延評価されるものがある。
遅延評価を上手く使えば効率的にクエリを書ける(クエリが実行される前に条件を綺麗にかける)
# 冗長なクエリの例
if some_condition
Employee.where(active: true)
.where('created_at >= ?', some_time)
.where.not(role: 'admin')
.where.not(name: 'System')
else
Employee.where(active: true)
.where.not(role: 'admin')
.where.not(name: 'System')
end
# こう書くと重複を消せる
base_scope = Employee.where(active: true)
.where.not(role: 'admin')
.where.not(name: 'System')
if some_condition
base_scope = base_scope.where('created_at >= ?', some_time)
end
base_scope

即実行系はこれ
これに入ってない
whereとか遅延評価になる。
コンソールからデバッカで調べれば良いだけだと思う