2012-09-21 43 views
10

Tôi đang sử dụng Ruby 1.9.2, Rails 3.0.x và tôi sử dụng MySQL DB. Tôi có một Mô hình tin nhắn, nơi người ta có thể đăng tin nhắn mới mỗi ngày.Bản ghi nhóm theo cả tháng và năm trong Rails

Tôi có hành động chỉ mục nơi tôi muốn hiển thị các thư này được nhóm theo cả tháng và năm. Điều này về cơ bản được sử dụng để lọc tin nhắn.

truy vấn của tôi trông như thế này: -

@active_msgs = Messages.where('expiry > ?', Time.now).order('created_at DESC') 

tôi đã sử dụng chức năng group_by trong Rails, sau khi tham khảo this post

My Nhóm By Query là: -

@msgs_by_month = @active_msgs.all.group_by {|u| u.created_at.month } 

tôi trả lại một Hash được gọi là @msgs_by_month. Điều này giúp tôi nhóm các tin nhắn theo tháng, nhưng tôi cần tính đến năm, để tạo thành khóa duy nhất, vì nó sẽ giúp tôi phân biệt giữa ví dụ: tháng 9 năm 2011 và tháng 9 năm 2012.

Khóa hiện tại của tôi chỉ có kiểu Hash [Month] (ví dụ Hash [9] => cho tháng 9, tôi có thể hiển thị tất cả các giá trị thích hợp). Làm thế nào tôi có thể nhận được một khóa duy nhất của loại tháng, năm mà tôi có thể dễ dàng lặp lại mặc dù để hiển thị tất cả các hồ sơ được nhóm theo tháng và năm tạo.

Cảm ơn bạn

EDIT: -

Tôi đoán một cách để làm điều này, là để tận dụng các created_at.to_date api, với điều kiện here . Tôi chỉ tự hỏi, làm thế nào tôi có thể loại bỏ ngày từ created_at.to_date để có được một độc đáo tháng, năm tổ hợp phím mà có thể làm việc với chức năng group_by.

+0

thể trùng lặp của [MySQL Query GROUP BY ngày/tháng/năm] (http://stackoverflow.com/questions/508791/mysql-query-group-by-day-month- năm) – noodl

+0

Không, không trùng lặp. q bạn đang đề cập đến chỉ liên quan đến MYSQL trong đó q này là một đường ray + mysql .. – Philip

Trả lời

29

Trong SQL:

select * from messages group by year(created_at), month(created_at); 

Trong Rails:

Message.all.group_by { |m| m.created_at.beginning_of_month } 
+0

Cảm ơn dude .. :). Nó hoạt động khi tôi nhập mệnh đề where cũng vào truy vấn .. Chỉ cần cho thông tin của tất cả .. – boddhisattva

0
Message.select("date_trunc('month', created_at) as month").group("month") 
Các vấn đề liên quan