読者です 読者をやめる 読者になる 読者になる

Arelの集計関数とActiveRecord::FinderMethods#firstの相性が微妙な気がする

何かfirstに対する根本的な誤解をしている気がしなくもなく。。

activerecord (3.1.0)
activerecord-oracle_enhanced-adapter (1.4.2)
emp = Employee.arel_table
q = Employee.select([emp[:manager_id].count.as('cnt')]).order(emp[:manager_id].asc)

o = q.first
# => SELECT COUNT("EMPLOYEES"."MANAGER_ID") AS cnt FROM "EMPLOYEES" ORDER BY "EMPLOYEES"."MANAGER_ID" ASC
p o.cnt
# => 106

o = q.group(:manager_id).first
# => SELECT * FROM (SELECT COUNT("EMPLOYEES"."MANAGER_ID") AS cnt FROM "EMPLOYEES" GROUP BY manager_id ORDER BY "EMPLOYEES"."MANAGER_ID" ASC) WHERE ROWNUM <= 1
p o.cnt
# => 14

ここからorderを抜くとこうなってしまう。

emp = Employee.arel_table
q = Employee.select([emp[:manager_id].count.as('cnt')])

o = q.first
# => SELECT COUNT("EMPLOYEES"."MANAGER_ID") AS cnt FROM "EMPLOYEES" WHERE ROWNUM <= 1
p o.cnt
# => 1

o = q.group(:manager_id).first
# => SELECT COUNT("EMPLOYEES"."MANAGER_ID") AS cnt FROM "EMPLOYEES" WHERE ROWNUM <= 1 GROUP BY manager_id
p o.cnt
# => 1

orderの代わりに別のなんてこと無いwhereを追加してもだめ。なぜかorderしないとSQLがうまく組み立てられない。

なぜかはよく分からないのでとりあえず気をつけるしかない。。