基于某种组合的红宝石计数

时间:2013-08-20 19:24:28

标签: 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

这些只是两个选项还是更清洁?

5 个答案:

答案 0 :(得分:2)

  

这些只是两个选项还是更清洁?

ton 更清洁的方式,但最好的方法将使用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?)

答案 1 :(得分:1)

无需将其转换为数组:

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

if data[:stats].reject{|k,v| v.empty?}.size > 1

答案 2 :(得分:0)

你可以这样做

data = {"stats" => { "team" => [], "outcome" => [1], "rank" => [] }}
if data["stats"].values.count([]) > 1
    #code
end

答案 3 :(得分:-1)

首先,它是哈希还是对象?我会想到哈希。

根据你的问题:某种MapReduce可能看起来更好:

["team", "outcome", "rank"].map{|key| stats[key].present? }.count(true) > 1

答案 4 :(得分:-1)

您可以尝试map / reduce,可以阅读更多here

在map / reduce之后你可以检查输出以查看是否有任何组合