2016-10-05 53 views
0

我想用3個數組中的每一個數組的數量構建一個句子。在ruby數組中查找空數組Rails 4

cats = Cat.all 
dogs = Dog.all 
birds = Bird.all 

animals = ["#{cats.count} Cats", "#{dogs.count} Dogs", "#{birds.count} Birds"] 

sentence = animals.each.map{ |r| r }.join(", ") 

眼下,這個工作,但如果我沒有貓句子輸出到

"O Cats, 5 Dogs, 4 Birds" 

和I'ld喜歡它,只是說:

"5 Dogs & 4 Birds" 

,或者在至少:

"5 Dogs, 4 Birds" 

我覺得我可能需要使用一組哈希值,但我有點失落。

+0

更簡單的事情是將動物數組聲明爲'animals = []',然後像元素一樣添加:'animals <<「#{cats.count} Cats」if cats.count> 0'。這一切都取決於你的實現如何完成,所以,這可能適用於你,也可能不適合你。 – fanta

回答

3

是的,你需要一個哈希值。

cats = Cat.all 
dogs = Dog.all 
birds = Bird.all 

animals = { 
    cats: cats.count, 
    dogs: dogs.count, 
    birds: birds.count 
} 

sentence = animals.reject{|k, v| v.zero?} 
        .map{|k, v| "#{v} #{k.to_s.capitalize}"} 
        .join(', ') 

我的建議:將數據保留爲最後一刻的數據,以便您可以以各種方式顯示最大的靈活性。我覺得代碼中的animals認爲渲染太快。

+3

僅供參考:'[貓,鳥,狗] .map {| c | [c.class.name.pluralize,c.count] .select {| a,b | b> 0} .map(&:join).join(「,」)'。這太巧妙了,但其中的一部分絕對值得用來縮短哈希的創建時間。 – meagar

+0

也許在這裏使用'zero?'。 –

+0

@ sagarpandya82哦,我不知道有'數字#零?'的方法。它確實使代碼更清潔一些。謝謝。 – Aetherus

2

要獲得"5 Dogs, 4 Birds",你可以做

sentence = animals.each.map{ |r| /^0\s/.match(r) ? nil : r }.compact.join(", ") 

正則表達式匹配以0和一個空格開始。如果匹配,則返回零,或返回原始字符串。 compact方法從數組中刪除nil元素,最後加入元素。

如果你想5 Dogs & 4 Birds,你可以定義一個方法來執行該功能。

def english_join(array) 
    return array.to_s if array.nil? or array.length <= 1 
    array[0..-2].join(", ") + " & " + array[-1] 
end 

然後,你可以做

sentence = english_join(animals.each.map{ |r| /^0\s/.match(r) ? nil : r }.compact) 

如果您有0貓,5只狗,4種鳥,這將返回5 Dogs & 4 Birds

如果你有2只貓,5只狗,4種鳥,這將返回2 Cats, 5 Dogs & 4 Birds

+0

我在這兩個答案之間撕裂。你們都是對的。再加上你的英語加入是正確的。 – NothingToSeeHere