【问题标题】:How do i make my code for my helper more slim?如何使我的助手代码更苗条?
【发布时间】:2019-11-20 11:07:51
【问题描述】:

首先,我刚开始在 stackoverflow 上提问。如果您对这个问题投反对票,请告诉我为什么以及如何更改它。

所以我正在为我们的实习生服务制作状态网页。

这是我拥有的代码,要清楚我想让“most_recent_checkresult_ids”方法更苗条:


  1 class OverallStatus
  2   def initialize(check_ids)
  3     @check_ids = check_ids
  4   end
  5
  6   def ok?
  7     !not_ok?
  8   end
  9
 10   def not_ok?
 11     Checkresult.where(id: most_recent_checkresult_ids).where(status: false).exists?
 12   end
 13
 14
 15
 16   private
 17
 18   def most_recent_checkresult_ids
 19     if @check_ids == nil
 20    Checkresult
 21     .select(:check_id, "MAX(id) as id")
 22     .group(:check_id)
 23     .map { |cr| cr.id }
 24     else
 25    Checkresult
 26     .select(:check_id, "MAX(id) as id")
 27     .where(check_id: @check_ids)
 28     .group(:check_id)
 29     .map { |cr| cr.id }
 30     end
 31   end
 32 end

我怎么能这样做?我不想要冗余代码,我知道有办法缩短它,但我不知道如何。

【问题讨论】:

  • 如果不给你确切的代码,我会首先考虑这些查询的作用以及是否有其他方法可以做到这一点(通过查看你在这里的内容,我可以肯定地说有) .尝试将逻辑封装在Checkresult 的范围内,然后您将看到重构。

标签: ruby-on-rails ruby helper


【解决方案1】:

您可以通过将if 条件限制为实际变化的部分来简化此代码,而不是重复更大的代码部分。

另外(一个小问题),您可以使用Symbol#to_proc 来缩短map 语法:

def most_recent_checkresult_ids
  check_results = Checkresult.select(:check_id, "MAX(id) as id")
  check_results = check_results.where(check_id: @check_ids) if @check_ids

  check_results.group(:check_id).map(&:id)
end

【讨论】:

  • 你可以用.ids代替.map(&:id)
  • 谢谢你帮了我很多。我最后使用了 if 语句所在的行。不知道那行得通。现在我有一个可以工作的 3 班轮,而且我没有多余的代码。
【解决方案2】:

您不需要有状态的类和大量的助手。

class OverallStatus
  def self.ok?(check_ids = nil)
    ids = Checkresult.select(:check_id, "MAX(id) as id")
    ids = ids.where(check_id: check_ids) unless check_ids.nil?

    not Checkresult.where(id: ids, status: false).exists?
  end
end

并将其用作

OverallStatus.ok?([1, 2, 3])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2014-06-17
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多