有没有办法在Ruby中重构以下代码

Mah*_*sta 0 ruby ruby-on-rails-5

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

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
Run Code Online (Sandbox Code Playgroud)

有人能帮忙吗?

3li*_*t0r 6

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

SELECT reviewings.employee_id
FROM reviewings
WHERE ...
GROUP BY reviewings.employee_id
HAVING COUNT(reviewings.id) >= <your value>
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

通过限制从数据库返回的数据,您可以省去Ruby方面的数据操作。

如果您想进一步了解Arel,建议您阅读他们的自述文件


让我添加一个有趣的比较。假设您要订购一些披萨。

  • 您当前正在执行以下操作:您打电话给您的披萨店,并要求他们发送每个披萨之一。当比萨饼到达您的家时,您和您的同志需要在吃之前弄清楚要保留哪些比萨饼以及丢弃哪些比萨饼。

  • 我建议:查看菜单,弄清楚您需要哪些披萨。只订购您需要的东西。当比萨饼到达您的家时,所有决定都已经制定和处理(假设正确的派送),您可以轻松享用比萨饼。