2011-03-18 56 views
4

我知道這個刪除重複:如何將兩個數組與Ruby中的重複項匹配?

@email.distributions.map(&:zip_code) & CardSignup.all.map(&:zip_code) 

但我想這樣做同樣的事情,在這裏我找到匹配任何東西,但它也表明我複製。

任何想法?

我正在嘗試查找簽署具有與我放置的郵政編碼首選項相匹配的郵政編碼的卡的人數。

+0

什麼是這兩個數組的(近似)的大小?比另一個大得多嗎? – tokland 2011-03-18 16:53:53

回答

7

Array#reject來救援,再次!像Array#map,它接受塊,讓你做這樣的事情:

zip_codes = CardSignup.all.map(&:zip_code) 
@email.distributions.reject{|o| !zip_codes.include?(o.zip_code)} 

哦,當然,如果你喜歡尋找更優雅的方式,總是考慮運營商如你已經做了。 &將返回一個新的數組,其中有兩個對象,|將加入並刪除重複項。

ruby-1.9.2-p0 > [1,2] | [2,3] 
=> [1, 2, 3] 
ruby-1.9.2-p0 > [1,2] & [2,3] 
=> [2] 

編輯:作爲Tokland在評論中說,因爲這是在一個Rails應用型,你可能要考慮這樣做的選擇。像這樣 -

zip_codes = CardSignup.all.map(&:zip_code) 
@email.distributions.where('zip_code IN (?)', zip_codes) 

或者,用INNER JOIN做。雖然看起來不漂亮。

@email.distributions.joins('INNER JOIN card_signups ON card_signups.zip_code = email_distributions.zip_code').all 

(如果@ email.distributions表是email_distributions ..)

+0

啊我現在有什麼清晰的清晰度。非常感謝fx_ – Trip 2011-03-18 16:27:28

+0

如果你抵制否定拒絕,你可以把它寫成select。此外,它可能值得使用一組「zip_codes」,以便包括?是O(1) – tokland 2011-03-18 16:51:12

+0

我添加了一些SQL善良的答案,以防萬一。 – 2011-03-18 19:25:20

相關問題