2013-05-30 13 views
5

Próbuję odtworzyć następujące kwerendy mysql w szynach 3Jak grupa na dzień i rok w Active Record w Rails3

select count(id), year(created_at), month(created_at) from table where published_state = 'published' group by year(created_at), month(created_at); 

Próbowałem coś takiego:

results = Table.select('count(id), year(created_at), month(created_at)').where('published_state LIKE ?', 'published').group('year(created_at), month(created_at)') 

ale nie zwraca tego, czego chcę.

ja po prostu to w zamian

[#<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, 
#<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >, #<Table >] 

W jaki sposób można to osiągnąć?

Dzięki!

Odpowiedz

14

Spróbuj tego:

Table.where(:published_state => 'published'). 
    group('year(created_at)').group('month(created_at)').count(:id) 

Format wyników nie jest całkiem to, czego się spodziewałem (jest to skrót z kluczy tablicy jak [year, month] i policzyć wartości), ale być może będzie ona służyć celom?

+0

Tak, rzeczywiście, istnieje sposób na uwzględnienie identyfikatorów w każdym wyniku? – content01

+0

Dzięki tej odpowiedzi bardzo mi pomogło ... – Sakeer

0

Jeśli używasz PostgreSQL, można również użyć funkcji date_trunc linii rozdzielających (dla czytelności, ale prawdopodobnie nie będzie działać w czasie rzeczywistym Ruby):

Table.select('count(id), date_trunc('month', created_at) as month') 
    .where('published_state LIKE ?', 'published').group('month') 

Zasadniczo, to obcina lub odcina części daty, która nie jest już znacząca. Na przykład, jeśli wybierzesz opcję "miesiąc", nadal będzie to oznaczać rok z miesiącem, ale nie będzie to dzień i godzina.

ja pewnie też zamówić ją tak:

Table.select('count(id), date_trunc('month', created_at) as month') 
    .where('published_state LIKE ?', 'published').group('month') 
    .order('month' DESC) 
    .limit(24) 

Czytaj więcej w docs here.

Powiązane problemy