रूबी, डुप्लिकेट के लिए वापसी की गिनती - रूबी, सरणी, डुप्लिकेट, डुप्लिकेट हटाने, बैज

मैं सोच रहा था कि क्या कोई मुझे डुप्लिकेट के लिए गिनती वापस करने में मदद कर सकता है?

ive पढ़ रहा था रूबी एरे में डुप्लिकेट कैसे गिना जाए

और वह बहुत करीब है जो मैं चाहता हूं।

उदाहरण के लिए अगर मेरे पास एक सरणी थी ...

[#<Badge id: 1, name: "justice">, #<Badge id: 9, name: "resonator">, #<Badge id: 9, name: "resonator"> ]

मैं एक फ़ंक्शन चाहता हूं जो कुछ संकेत लौटाएगा उपयोगकर्ता के पास बैज "गुंजयमान यंत्र" के 2 हैं।

कैसे करने के लिए एक बिल्ला प्रणाली बनाने की कोशिश कर रहा imस्टैकओवरफ़्लो का काम। कुछ बैज को कई बार सम्मानित किया जा सकता है, और यदि वे हैं, तो मुझे बैज की गिनती के कुछ रूप चाहिए। हालांकि, यह सोचने में बहुत परेशानी हो रही है कि यह कैसे किया जाए। मुझे लगता है कि पहले मुझे इसकी मात्रा गिनने की ज़रूरत है डुप्लिकेट।

अंततः मेरे कोड के अंत में, बस बैज नाम को इस तरह से प्रस्तुत करना

<li>
<%= badge_item.name %>
</li>

ताकि यह कुछ इस तरह दिखा ...

बैज:

न्याय

अनुनाद x2

मैं यह कैसे कर सकता हूँ? हटा रहा है जाने के लिए सही तरीका डुप्लिकेट मदद की सराहना की जाएगी। धन्यवाद!

उत्तर:

जवाब के लिए 2 № 1

आप शायद ऐसा कुछ करना चाहते हैं:

नियंत्रक:

@badge_names_with_counts = user.badges.count(group: :name)

राय:

<% @badge_names_with_counts.each do |badge_name_with_count| %>
<%= badge_name_with_count.name %> x<%= badge_name_with_count.count %>
<% end %>

उत्तर № 2 के लिए 1

वैसे शायद ऐसा करने के लिए एक अधिक फैंसी माणिक तरीका है लेकिन एक शुरुआत के लिए आप कुछ ऐसा कर सकते हैं:

badges = [#<Badge id: 1, name: "justice">, #<Badge id: 9, name: "resonator">, #<Badge id: 9, name: "resonator"> ]
counts = {}

badges.each do {|badge|
#depends on you whether you want to count by id or name
counts[badge.id] ||= 0
counts[badge.id] += 1
}

और फिर आप सुरक्षित रूप से अपने सरणी को अद्वितीय बना सकते हैं और इस तरह से काउंट्स प्रदर्शित कर सकते हैं:

badges.uniq!

badges.each do |badge|
puts badge.name
puts counts[badge.id]
end

लेकिन मुझे पूरा यकीन है कि काउंट बनाने के लिए माणिक में एक बेहतर शोधक है। शायद वह इंजेक्शन या कम कर सकता है।


जवाब के लिए 0 № 3

किसी कारण के लिए, विधि .count wasn "t वर्किंग। शायद मैं wasn" db या कुछ और से खींच रहा हूँ तो इसके बजाय मैंने अपने नियंत्रक में किया ..

@badge_names_with_counts = @user.badges.group_by(&:name)

जो एक हैश लौटाता है, और मैं इसके माध्यम से पाला जाता है ...

<% if @badge_names_with_counts.any? %>
<ol class="badges">
<% @badge_names_with_counts.each do |key, value| %>
<% if value.count > 1 %>
<li><%= key %> x <%= value.count %></li><br/>
<% else %>
<li><%= key %></li><br/>
<% end %>
<% end %>
</ol>
<% end %>

संबंधित सवाल
सबसे लोकप्रिय