ruby-on-rails - 基于特定组合的 ruby 计数

标签 ruby-on-rails ruby ruby-on-rails-3

我有以下格式的数据

"stats": {
    "team": [],
    "outcome": [],
    "rank": []
}

我需要确定上述结构中是否存在 2 个或更多结果的组合,然后打印一些内容。

所以思路是:

(if stats.team.present? && if stats.outcome.present) || (if stats.outcome.present? && if stats.rank.present) || (if stats.team.present? && if stats.rank.present)

更好的方法是创建一个方法来添加一个计数器,如果团队、结果、等级的计数大于 0,该计数器就会递增。

然后检查计数器是否大于 2。 例如:

def my_count
  count = 0

  count += 1 if stats.team.count > 0
  count += 1 if stats.outcome.count > 0
  count += 1 if stats.rank.count > 0

  if count > 1
    return true
  end
end

这些是唯一的 2 个选项还是有更简洁的方法?

最佳答案

Are these the only 2 options or is there a cleaner way?

更简洁的方式,但最好的方式将使用 many? , ActiveSupport 的一部分。

many? 本质上类似于 any?,但不是询问“一个或多个”是否满足条件,而是询问是否两个或更多。这是迄今为止您的问题在语义上最正确的实现:

stats = { team: [], outcome: [], rank: [] }}

stats.many? { |k,v| v.present? } # false

stats = { team: [1], outcome: [1], rank: [] }}

stats.many? { |k,v| v.present? } # true

你可以更聪明地使用 stats.valuesSymbol#to_proc 来进一步缩短它,但我认为没有必要:

stats.values.many?(&:present?)

关于ruby-on-rails - 基于特定组合的 ruby 计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18343409/

相关文章:

ruby-on-rails - 如何使 ActiveRecord 成为线程安全的

ruby-on-rails - Rails 3-从 View 中呈现PDF并附加到电子邮件

ruby-on-rails - Nginx + Phusion Passenger + Rails = 不会设置 staging ENV

ruby - 使用 Ruby Sequel 返回原始 sql 的模型实例

ruby-on-rails - 无法通过 Mechanize (Ruby) 提交亚马逊表单

ruby-on-rails - 强制子域和删除子域

ruby-on-rails - 将 Rails 与 Comet 服务器集成的设计模式

ruby - Rack 请求日志

ruby-on-rails - Rails 3 UTF-8 查询字符串出现在 URL 中?

ruby-on-rails - Rails 3 - 嵌套表单有很多通过与复选框的关联