加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何按列对Rails ActiveRecord结果进行分组?

发布时间:2020-12-17 03:39:38 所属栏目:百科 来源:网络整理
导读:我正在花一点时间跟踪应用程序并遇到了一个我不知道如何解决的问题.我有一个Task模型和一个Client模型.每个任务都属于一个客户端. class Task ActiveRecord::Base belongs_to :client attr_accessible :client_id,:description,:start,:end scope :yesterday
我正在花一点时间跟踪应用程序并遇到了一个我不知道如何解决的问题.我有一个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

我确信有一个干净,简单的轨道方式来做到这一点,但我不知道如何.如何才能做到这一点?

解决方法

你可以让数据库为你这样做:

@yesterdays_clients = Client.includes(:tasks).merge(Task.yesterday).order(:name)

除了更清洁之外,它更高效,因为它可以一次性完成所有客户和任务.原始代码受N 1个查询限制,因为没有急切的加载.

顺便说一句,你可以让你的范围更简单:

scope :yesterday,-> { where(:start => (Date.yesterday.to_time...Date.today.to_time)) }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读