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がうまく組み立てられない。
なぜかはよく分からないのでとりあえず気をつけるしかない。。