我已经编写了一段代码,需要对其进行重构。
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解决此问题外,您还可以选择让数据库处理问题。但是,要做到这一点,您首先需要知道您的查询是什么,我会选择类似的东西:
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)
对我来说,第一步是将where
子句和group
移到命名作用域。这将减少初始段:
Reviewing.where(reviewing_status_condition(employee_ids)).group(:employee_id).count
更像是:
Reviewing.reviewing_count(reviewing_status_condition(employee_ids))
不是很多,但是确实大大改善了实现与执行的分离。
第二步取决于您使用的红宝石版本。 2.7之前的版本进行映射和压缩步骤的正确方法是您已经拥有或可以用select
和map
完成的工作,但是Ruby 2.7引入了filter_map
,这是您在此处所做的单步组合。
请参阅此答案以获取关于filter_map的更多详细信息:https://stackoverflow.com/a/56565188/888892