2016-05-22 23 views
0

ruby​​ on rails user here。次のコード行について質問があります。Rails、結果を反復処理する代わりに配列を返すモデルメソッド

最初の例です。

<% sailing.travelling_parties.each do |party| %> 
    <% party.party_registers.each do |reg| %> 
    <%= reg.user.detailed_user.first_name %> 
    <% end %> 
<% end %> 

私はビューで実行すると、私は複数の名前が印刷された私の期待した結果を得る。モデルに移動して次のように変更すると、

2番目の例ではモデルです。 **はこの全体の例で私が実際に達成しようとしていることを表しています。

class Sailing < ActiveRecord::Base 

... 

def gather_data 
self.travelling_parties.each do |party| 
    party.party_registers.each do |reg| 
    reg.user.detailed_user.first_name 
    ** use a variable to count loop iterations ** 
    end 
end 
end 

第二の例では、ビュー

<%= sailing.gather_data %> 

にこれは、私はまったく予想していたものを、私は反復処理しようとしています「travelling_parties」で満たされた配列ではなくプリントアウトされました!したがって、明らかに、セーリングの記録にいくつの名前が入っているかにかかわらず、1回だけループします。

なぜこのようなことが起こっているのか、最初の例のように実際にビジネスロジックを表示しなくても、どのように動作させることができるでしょうか?

おかげ

答えて

1

指定したブロックに応じて他の配列に配列を変換Array#mapを、使用することができる:

def gather_data 
    travelling_parties.map do |party| 
    party.party_registers.map do |reg| 
     reg.user.detailed_user.first_name 
    end 
    end 
end 

この方法は、最初の名前を持つ配列の配列を返します。あなたは一次元配列を取得したい場合は、代わりに最初のmapflat_mapは以下のように、使用します。

def gather_data 
    travelling_parties.flat_map do |party| 
    party.party_registers.map do |reg| 
     reg.user.detailed_user.first_name 
    end 
    end 
end 
+0

グレートを!これは私が探していたものです、ありがとうございます。私の名前の配列を取得し、

<%= sailing.gather_data.count%>

<%= sailing.gather_data%>

(基本的には電話をかけずに名前の数を得ることができることを知っていますかもう一度おねがいします! – Aptorian

+0

@Aptorian、 'sailing.gather_data'を変数に入れ、この変数に' count'の代わりに 'size'を使います – Ilya

関連する問題