我正在花一点时间跟踪应用程序并遇到了一个我不知道如何解决的问题.我有一个Task模型和一个Client模型.每个任务都属于一个客户端.
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
我确信有一个干净,简单的轨道方式来做到这一点,但我不知道如何.如何才能做到这一点?