2013-08-20 16 views
2

我有以下列格式红宝石计数基于某些组合

"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个选项或者是有一个更清洁的方式?

+8

FYI ,Ruby中没有'++'操作符。 – squiguy

回答

2

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

一个吨的更清洁的方式,但最好的将使用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?) 
0

你可以做

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

没有必要把它改造成一个数组:

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

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

聪明的举动! +1 – MrYoshiji

-1

首先是散列或反对呢?我会想到哈希。

根据你的问题:某种的MapReduce可以更好看:

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

你可以试试的map/reduce,可以读取更多here

地图后

/减少可以检查输出看看是否有任何组合