2012-01-30 34 views
13

tôi có mô hình sau đây:ray 3 nhóm bằng và tổng

activity_types: id, name 

activities: id, id_activity_type, occurrences, date (other fields) 

Các cửa hàng hoạt động bảng bao nhiêu lần một hoạt động xảy ra vào ban ngày. Nhưng bây giờ tôi muốn hiển thị cho người dùng biết có bao nhiêu hoạt động từ mỗi loại xảy ra theo tháng.

tôi có những giải pháp sau đây based on this post mà có vẻ ok:

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") 

nhưng điều này dường như rất nhiều mã cho các tiêu chuẩn đường ray và rails API says it's deprecated.

Tôi tìm thấy giải pháp sau đó là rất nhiều đơn giản:

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

nào trả về một băm với activity_type_id => xuất hiện.

Tôi phải làm gì để nhận được băm sau: activity_type.name => lần xuất hiện?

+0

'activity_types: id, name' đây activity_type tên sẽ được uniq? nhóm và đặt hàng trên activity_types.id chỉ vì bạn muốn băm đặt hàng dựa trên activity_types.id, phải không? –

Trả lời

15

Nếu truy vấn ban đầu làm việc, sau đó chỉ cần cố gắng viết lại nó với Rails 3 cú pháp:

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

Vâng, nếu tôi không tìm thấy bất kỳ giải pháp sạch hơn (1 hoặc 2 dòng mã), tôi sẽ đi với điều này. Nhưng nó không cảm thấy như đường ray – 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 

trong trường hợp bạn cần một băm ra lệnh dựa trên activity_types.id và giả định activity_types_id không phải là cần thiết như một phần của khóa băm.

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

trong trường hợp [activity_type_id, activity_types.name] cần thiết như một phần của chính

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

Nó nói rằng activity.id phải xuất hiện trong mệnh đề GROUP BY hoặc được sử dụng trong một hàm tổng hợp. Tôi đã có thể sửa lỗi này bằng cách thêm mệnh đề select, nhưng sau đó câu trả lời của bạn tương tự như câu trả lời @maprihora – dcarneiro

+0

bạn muốn nói activity_types_id và activity.id được viết ở trên là comment typo? –

+0

được cập nhật cho tổng hợp có khóa –

Các vấn đề liên quan