Hacking a subselect in ActiveRecord
U našoj Rails aplikaciji imamo jedan prilično nezgodan problem, o kome sam već pisao na DPT-u. Ukratko, treba mi broj slogova koji vraća SQL upit grupisan po nekoliko polja (videti primer na DPT-u). S obzirom da se ovo koristi iz Rails aplikacije korišćenjem ActiveRecord-a, nije moguće (barem u to doba nije bilo) izvršiti upit korišćenjem podupita, tj. nije moguće izvesti nešto ovako:
SELECT COUNT(*) FROM
(SELECT 1 FROM tabela GROUP BY a, b) t
Pomoću uputstva na linkovanom članku ovo je ipak moguće izvesti, doduše malim hakovanjem pozivanjem privatne metode na ActiveRecord::Base klasi. Ona generiše SQL string koji posle koristimo kao vrednost parametra :from u upitu koji vraća COUNT, nešto ovako:
count_sql = Model.send(:construct_finder_sql, :select => 1, :group => 'a, b')
Model.count(:from => "(#{count_sql}) a")
Izgleda da radi. ;)