2012-01-30 21 views
13

ben şu modeli var. Ancak şimdi kullanıcıya her bir türden kaç etkinliğin ay başına geldiğini göstermek istiyorum. raylar tarafından 3 grup ve toplamı

tamam görünüyor aşağıdaki çözümü based on this post var:

Activity.all(:joins => :activity_types, 
      :select => "activity_types.id, activity_types.name, SUM(activities.occurrences) as occurrences", 
      :group => "activity_types.id, activity_types.name", 
      :order => "activity_types.id") 

ama bu raylar standartları ve rails API says it's deprecated için bir sürü kod görünüyor. activity_type_id => olaylar ile karma döndürür

Activity.sum(:occurrences).group(:activity_type_id) 

:

Ben çok basittir aşağıdaki çözümü buldum.

Aşağıdaki karmayı elde etmek için ne yapmalıyım: activity_type.name => oluşumlar? orijinal sorgu çalıştıysa

+0

'activity_types bir parçası olarak gerekli: id, activity_type isim gidiyor burada name' uniq edilecek? activity_types.id üzerinde gruplandırma ve sipariş verme, yalnızca hash'ın activity_types.id temelli olmasını istediniz, değil mi? –

cevap

15

, o zaman sadece Raylar 3 sözdizimi ile yeniden deneyin: durumunda

Activity.joins(:activity_types) 
    .select("activity_types.id, activity_types.name, SUM(activities.occurrences) as occurrences") 
    .group("activity_types.id, activity_types.name") 
    .order("activity_types.id") 
+0

Eğer daha temiz bir çözüm bulamazsam (1 veya 2 satır kod), bununla gideceğim. Ancak sadece raylar gibi hissetmiyor – dcarneiro

4

Activity.joins(:activity_types).group('activity_types.name').sum(:occurrences)

SELECT SUM(activities.occurrences) AS sum_occurrences, activity_types.name AS activity_types_name FROM activity_types INNER JOIN activity_types ON activity_types.id = activities.activity_types_id GROUP BY activity_types.name 

Eğer activity_types.id dayanan bir sipariş karma gerekli ve activity_types_id varsayarak değil hash anahtarının bir parçası olarak gerekli.

Activity.joins(:activity_types).group('activity_types.name').order(:activity_types_id).sum(:occurrences) 

örtmek [activity_type_id, activity_types.name] kilit

Activity.joins(:activity_types).group(:activity_types_id, 'activity_types.name').order(:activity_types_id).sum(:occurrences) 
+0

Bu, activity.id öğesinin GROUP BY deyiminde görünmesi gerektiğini veya bir toplama işlevinde kullanıldığını söylüyor. Ben bir select yan tümcesi ekleyerek bunu düzeltmek başardı, ama sonra senin cevabını @maprihora yanıtı – dcarneiro

+0

benzer olduğunu söylemek istiyorum faaliyeti_types_id ve activity.id yukarıda yazılan yorum yazım hatası hatası mı? Komut için –

+0

güncelleştirildi, bu komutu çalıştırdığım zaman anahtar –