LoginSignup
6
6

More than 5 years have passed since last update.

squeelあれこれ

Posted at

記述力が高いのは魅力的なんだけど書き方悩んだクエリが結構あるのでご紹介。

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) }
6
6
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
6
6