Ruby Srbija

Mi smo društvo Ruby programera Srbije (Serbian Ruby user group), i okupljamo ljude koji profesionalno razvijaju softver u programskom jeziku Ruby.

Imamo mailing listu i organizujemo povremena druženja na koja su dobrodošli svi zainteresovani. Ovaj blog sadrži beleške sa tih sastanaka, kao i članke o Rubiju i srodnim tehnologijama.

8.3.2010.

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. ;)

Etikete ↓ Mladen Jablanović ActiveRecord Rails SQL # Komentari