2016-10-05 9 views
0

私は3つの配列からそれぞれの配列の数で文を構築しようとしています。ルビ配列内の空の配列を見つける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'のように要素を1つずつ追加します。それはあなたの実装がどのように行われるかによって異なりますので、これはうまくいくかもしれません。 – 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

FYI: '[Cat、Bird、Dog] .map {| c | [c.class.name.pluralize、c.count] .select {| a、b | > 0} .map(&:join).join( "、") '。これはあまりにも巧妙ですが、ハッシュの作成を短縮するためには、その一部を採用する価値があります。 – meagar

+0

おそらく 'ゼロ? 'を使用します。 –

+0

@ sagarpandya82ああ、私はメソッド 'Numeric#zero? 'を知りませんでした。それはコードを少しきれいにします。ありがとう。 – Aetherus

2

"5 Dogs, 4 Birds"を取得するには、あなたが

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

を行うことができます正規表現は0とスペースで始まるものと一致しました。一致するものがあれば、nilを返し、元の文字列を返します。 compactメソッドは、配列からnil要素を削除し、最後に要素を結合します。 が必要な場合は、その機能を実行するメソッドを定義できます。

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

次に、あなたが0猫、5匹、および4羽を持っている場合、これは5 Dogs & 4 Birdsを返し

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

を行うことができます。

あなたは2匹の猫、犬5、および4羽の鳥を、持っている場合、これは2 Cats, 5 Dogs & 4 Birds

+0

私はこれら2つの答えの間に引き裂かれています。あなたはどちらも正しいので。プラスあなたの英語の参加は右です。 – NothingToSeeHere

関連する問題