我正在研究一些時間跟蹤應用程序,並遇到了一個我不知道如何解決的問題。我有一個Task
模型和一個Client
模型。每個任務都屬於客戶端。如何將Rails的ActiveRecord結果按列分組?
class Task < ActiveRecord::Base
belongs_to :client
attr_accessible :client_id, :description, :start, :end
scope :yesterday, -> {
where('start > ?', Date.yesterday.to_time).where('start < ?', Date.today.to_time)
}
end
class Client < ActiveRecord::Base
attr_accessible :name
has_many :tasks
end
現在我正在顯示由天作用域的任務列表中的任務已經完成,並通過他們完成時間排序。我想顯示相同的列表,但由客戶端分組,並按客戶端名稱排序。這是我想要做什麼:
<div id="yesterday_summary">
<% @yesterday_clients.each do |client| %>
<h2><%= client.name %></h2>
<ul>
<% client.tasks.each do |task| %>
<li><%= task.description %></li>
<% end %>
</ul>
<% end %>
</div>
在我的控制器我目前有:
@tasks_yesterday = Task.yesterday
@yesterday_clients = group_tasks_by_client @tasks_yesterday
而在group_tasks_by_client
方法,我有一些非常醜陋的代碼,甚至沒有做什麼工作的:
def group_tasks_by_client(tasks)
clients = []
tasks.collect(&:client).each do |client|
clients << {client.id => client} unless clients.has_key? client.id
end
clients_with_tasks = []
clients.each do |client|
c = Struct.new(:name, :tasks)
cl = c.new(client.name, [])
tasks.each do |task|
cl.tasks << task if task.client_id = client.id
end
clients_with_tasks << cl
end
clients_with_tasks
end
我敢肯定,有一個乾淨,簡單的方式來做到這一點,但我不知道如何。如何才能做到這一點?
是否軌GROUP_BY http://apidock.com/rails/Enumerable/group_by http://railscasts.com/episodes/29-逐個月的方法幫助? – Catfish 2013-03-06 18:34:11
@Catfish這個'group_by'方法看起來非常有用。謝謝! – Andrew 2013-03-06 19:14:35