Ruby on rails 此选择/映射是否可以更具可读性?

Ruby on rails 此选择/映射是否可以更具可读性?,ruby-on-rails,ruby,refactoring,Ruby On Rails,Ruby,Refactoring,我有一个ActiveRecord中的对象数组,我正在运行select和map以获取一些值: @jobs.select{|u| u[:user_id] == user.id}.map{|t| t[:regular_time]}.sum 有没有更具可读性的方法 随着map变量的更改,将会有很多变化,如下所示: @jobs.select{|u| u[:user_id] == user.id}.map{|t| t[:ot_time]}.sum @jobs.select{|u| u[:user_id]

我有一个ActiveRecord中的对象数组,我正在运行
select
map
以获取一些值:

@jobs.select{|u| u[:user_id] == user.id}.map{|t| t[:regular_time]}.sum
有没有更具可读性的方法

随着
map
变量的更改,将会有很多变化,如下所示:

@jobs.select{|u| u[:user_id] == user.id}.map{|t| t[:ot_time]}.sum
@jobs.select{|u| u[:user_id] == user.id}.map{|t| t[:vacation_time]}.sum
@jobs.select{|u| u[:user_id] == user.id}.map{|t| t[:holiday]}.sum
这样做的原因是我已经在一个查询中加载了数据,然后我将其拆分为用户,然后再将与每个用户相关联的各种数据位


实际上,这样做是为了避免进行数千次DB调用。

看起来用户有很多工作要做。如果是这种情况,那么您可以使用活动记录

user.jobs.sum(:regular_time)
user.jobs.sum(:ot_time)
....

如果您不想使用活动记录(如果您的项目已经加载,请避免db查询),那么您所能做的就是注释中已经提到的内容。我喜欢使用
.map(&:attribute\u name).sum

看起来用户有很多工作。如果是这种情况,那么您可以使用活动记录

user.jobs.sum(:regular_time)
user.jobs.sum(:ot_time)
....

如果您不想使用活动记录(如果您的项目已经加载,请避免db查询),那么您所能做的就是注释中已经提到的内容。我喜欢使用
.map(&:attribute\u name).sum

我认为你的代码很好。如果需要,您仍然可以使用lambda进行拆分:

right_user = -> u {u[:user_id] == user.id } #creating a lambda
@jobs.select(&right_user).map(&:regular_time).sum
注意

right_user = -> u {u[:user_id] == user.id } #creating a lambda
完全等同于

right_user = lambda { |u| u[:user_id] == user.id } #creating a lambda

我认为你的代码很好。如果需要,您仍然可以使用lambda进行拆分:

right_user = -> u {u[:user_id] == user.id } #creating a lambda
@jobs.select(&right_user).map(&:regular_time).sum
注意

right_user = -> u {u[:user_id] == user.id } #creating a lambda
完全等同于

right_user = lambda { |u| u[:user_id] == user.id } #creating a lambda

我将使用
user\u id
对作业进行分组:

并使用以下公式计算总和:

@jobs_by_user[user.id].sum(&:ot_time)
@jobs_by_user[user.id].sum(&:vacation_time)
@jobs_by_user[user.id].sum(&:holiday)

我将使用
user\u id
对作业进行分组:

并使用以下公式计算总和:

@jobs_by_user[user.id].sum(&:ot_time)
@jobs_by_user[user.id].sum(&:vacation_time)
@jobs_by_user[user.id].sum(&:holiday)

创建一个方法怎么样?为什么不
@jobs.选择{u | u.user_id==user.id}.map(&:regular_time).sum
是否可以在数据库查询中至少按用户限制作业?这样,您甚至不需要进行第一次选择。这似乎在数据库查询中处理得更好-在ruby代码中执行此操作会慢得多,因为所有对象都需要加载到内存中。@DaveMongose最好是成百上千,其他查询的数量?创建一个方法如何?为什么不
@jobs。选择{u | u.user_id==user.id}.map(&:regular_time)。sum
是否可以在数据库查询中至少按用户限制作业?这样,您甚至不需要进行第一次选择。这似乎在数据库查询中会得到更好的处理-在ruby代码中执行此操作会慢得多,因为所有对象都需要加载到内存中。@DaveMongose最好进行数百次(如果不是数千次)的额外查询?