2011-02-12 19 views
8

मैं निम्नलिखित है:रेल - समूह_बी का उपयोग करते समय - इंडेक्स कैसे प्राप्त करें?

sets = DataSet.all.group_by{ |data| [data.project_id, "-", data.thread_id].join(" ") } 

<% sets.each do |range, datas| %> 
    <p><%= range %>:</p> 
    <% datas.each do |data| %> 
    <%=data%> 
    <p>Last Post<%= data.last.created_at %></p> 
    <% end %> 
<% end %> 

समस्या यह है कि मैं एक सूचकांक की जरूरत है। 0 के लिए अपरिभाषित विधि `पिछले ':: त्रुटि के साथ

<% sets.each_with_index do |range, datas, i| %> 
    <p><%= range %>:</p> 
    <% datas.each do |data| %> 
    <%= i %> 
    <%=data%> 
    <p>Last Post<%= data.last.created_at %></p> 
    <% end %> 
<% end %> 

यही तो टूट जाता है, तो मैं के साथ ऊपर अद्यतन Fixnum

विचार? धन्यवाद

उत्तर

13

जो समस्या आप देखते हैं वह ब्लॉक के पैरामीटर को दिए जाने के तरीके के कारण है। आपके दूसरे उदाहरण में, आप देखेंगे कि range में एक range और datas मिलान करने वाला एक सरणी है, datas चर में इंडेक्स और i हमेशा nil है।

ऐसा इसलिए है क्योंकि रूबी "unsplats" arrays अगर यह ब्लॉक के लिए एकमात्र पैरामीटर है। यदि आपके पास एक से अधिक प्रकार हैं (इस मामले में एक सरणी और एक पूर्णांक), तो आपको यह करना चाहिए कि उसे क्या करना चाहिए। सबसे आसान तरीका है ब्रांड्स का उपयोग करना।

<% sets.each_with_index do |(range, datas), i| %> 
    ... 
<% end %> 

इस तरह, माणिक तुम क्या मतलब पता है और ऊपर range और datas में सरणी विभाजित कर देगा। यह वास्तव में अल्पविराम ऑपरेटर के संयोजन के साथ रूबी के असाइनमेंट ऑपरेटर की एक विशेषता है। यह इस

my_array = [1, 2] 
(x, y) = my_array 
p x    # prints 1 
p y    # prints 2 
+0

धन्यवाद होल्गर, पहली बार मैंने इस परिदृश्य को मारा है। – AnApprentice

संबंधित मुद्दे