Open6

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

toketoke

これも良さげ

# 始端無し
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

https://techracho.bpsinc.jp/gengen/2022_12_20/125057

toketoke

ActiveRecordの検索系のメソッドには即SQLが発行されるのと遅延評価されるものがある。
https://qiita.com/ykamez/items/0c81a33ec1b90219d541

遅延評価を上手く使えば効率的にクエリを書ける(クエリが実行される前に条件を綺麗にかける)

# 冗長なクエリの例
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