是否有一种方法可以在ruby中重构以下代码

问题描述 投票:-1回答:2

我已经编写了一段代码,需要对其进行重构。

Reviewing.where(reviewing_status_condition(employee_ids)).group(:employee_id).count.map{ 
|employee_id, reviewings_count_per_employee|
    employee_id if reviewings_count_per_employee >= @cycle.min_required_anon_feedback
  }.compact

任何人都可以帮忙吗?

ruby ruby-on-rails-5
2个回答
2
投票

除了使用Ruby解决此问题外,您还可以选择让数据库处理问题。但是,要做到这一点,您首先需要知道您的查询是什么,我会选择类似的东西:

SELECT reviewings.employee_id
FROM reviewings
WHERE ...
GROUP BY reviewings.employee_id
HAVING COUNT(reviewings.id) >= <your value>

这可以通过以下代码实现:

reviewings = Reviewing.arel_table

employee_ids = Reviewing
               .where(reviewing_status_condition(employee_ids))
               .group(:employee_id)
               .having(reviewings[:id].count.gteq(@cycle.min_required_anon_feedback))
               .pluck(:employee_id)

0
投票

对我来说,第一步是将where子句和group移到命名作用域。这将减少初始段:

Reviewing.where(reviewing_status_condition(employee_ids)).group(:employee_id).count

更像是:

Reviewing.reviewing_count(reviewing_status_condition(employee_ids))

不是很多,但是确实大大改善了实现与执行的分离。

第二步取决于您使用的红宝石版本。 2.7之前的版本进行映射和压缩步骤的正确方法是您已经拥有或可以用selectmap完成的工作,但是Ruby 2.7引入了filter_map,这是您在此处所做的单步组合。

请参阅此答案以获取关于filter_map的更多详细信息:https://stackoverflow.com/a/56565188/888892

© www.soinside.com 2019 - 2024. All rights reserved.