Ruby

2013-11-05 18 views
5

dizisinden yinelenen nesneleri kaldırın. Tüm yinelenen nesneleri aşağıdaki kullanıcı_list dizisinden kaldırmak için geleneksel Ruby yöntemleriyle istenen sonuçları elde edemiyorum. Bu sorunu çözmenin akıllı bir yolu var mı?Ruby

users = [] 
user_list.each do |u| 
    user = User.find_by_id(u.user_id) 
    users << user 
    #users << user unless users.include?(user)  # does not work 
end 
#users = users.uniq  # does not work 
+2

gibi nesnelerin nil kaldırmak için kompakt kullanabilirsiniz 'gerçekten çalışması gerekir uniq'. Test etmek için attığınız adımları ve sonuçlarınızın neler olduğunu gösterebilir misiniz? Kullanıcının dizisindeki nesnelerin sınıfı nedir ve '==' operatörleri nasıl tanımlanır? Bu Ruby on Rails mi? –

+0

Rails 4' veya Rails 3' kullanıyor musunuz? Oh, hiç ray kullanıyor musun? Değilse, 'Kullanıcı' sınıfı nedir? – nzifnab

+2

Merhaba arkadaşlar, bu yanlış bir alarmdı! Veriyi yanlış formatta aradım. users.uniq gerçekten çalışıyor! Yardım ettiğin için teşekkür ederim. – user2041343

cevap

9

Bu nasıl?

users = User.find(user_list.map(&:user_id).uniq) 

Bu, bir veritabanı çağrıyı yerine user_list.size veritabanı aramaları olmanın ek faydası yoktur.

+0

Bu, şu anda yaptığı şeyden çok daha verimlidir. Ayrıca, veritabanı sorgusunu rahat bir şekilde yürütecek ve uniq'i otomatik olarak işleyebilen User.where (user_id: user_list.map (&: user_id)) işlevini de yapabilir. – nzifnab

5
user_list.uniq! 

Bu, tüm yinelenen değerleri kaldırmalı ve benzersiz olanları kullanıcı listesinde saklamalıdır. Umarım bu aradığınız şeydir.

0

Ayrıca

MainMenu.first.second_sale_elements.each.map(&:sale_structure).compact.uniq