2013-05-30 30 views
5

Ben böyle bir şey denedim 3nasıl raylar 3.

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

Ben raylar aşağıdaki MySQL sorgu yeniden çalışıyorum Aktif Record gün ve yıla göre grup için:

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

ama İstediğimi geri getirmiyor.

Sadece bunu gerçekleştirmek nasıl

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

karşılığında

bu olsun?

Teşekkürler!

cevap

14

bu deneyin: Sonuçların

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

biçimi (o [year, month] ve değerleri saymak gibi dizi anahtarları ile karma) ama belki de senin amaçlara hizmet edecek bekliyordum oldukça değil mi? Eğer PostgreSQL kullanıyorsanız

+0

Evet, aslında, her bir sonuca kimlikleri eklemenin bir yolu var mı? – content01

+0

Teşekkürler bu cevap bana çok yardımcı oldu ... – Sakeer

0

, ayrıca date_trunc işlevini kullanabilirsiniz (okunabilirlik için bölme çizgileri ama muhtemelen gerçek Ruby çalışmaz):

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

Temelde, keser veya parçalar keser Artık önemli olmayan tarih. Örneğin, 'month' seçerseniz, yine de yılı ay ile korur, ancak gün ve saati değil.

Ben de şöyle sipariş muhtemelen olacaktır:

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

docs here daha okuyun.