記述力が高いのは魅力的なんだけど書き方悩んだクエリが結構あるのでご紹介。
between
Model.where { date >> (time..time + 1.day) }
Rangeの..と...は区別される。
以下のクエリもRangeに合うように範囲を切ってくれる。イカす。
Model.where { date >> (time...time + 1.day) }
IN句
これもRangeで表すこともできる。
Model.where { date.in(time...time + 1.day) }
RDBの関数
そのまま書くか、バッククォートで呼べる。
Model.select { to_char(created_at, 'YYYY-MM-DD').as(created_date) }
変数とカラム名が被った
RDBの関数と同じく、バッククォートで解決できる。
squeelのクエリはrubyの式として評価されているのでカラム名と同じ名前の引数は使えない。
# この書き方はエラー
def get_model_data(user_id)
Model.select { user_id == user_id }
end
=> RuntimeError: unsupported: TrueClass
そこでバッククォートですよ奥さん。
def get_model_data(user_id)
Model.select { `user_id` == user_id }
end
複雑なSELECT
よくあるselectで*を求めつつ別個加工したカラムを持つ、ってパターン
Model.select { [`*`, cast(created_at.as date).as(created_date)] }
Whereの接続
&&で繋げると何故か一番最後の式しか評価してくれない
#これは間違い
Model.where { user_id == nil && created_at >= Time.now }
それもそのはず、ANDに相応する記号が違うのです。ちなみにカッコは必須。
Model.where { (user_id == nil) & (created_at >= Time.now) }