我知道這個刪除重複:如何將兩個數組與Ruby中的重複項匹配?
@email.distributions.map(&:zip_code) & CardSignup.all.map(&:zip_code)
但我想這樣做同樣的事情,在這裏我找到匹配任何東西,但它也表明我複製。
任何想法?
我正在嘗試查找簽署具有與我放置的郵政編碼首選項相匹配的郵政編碼的卡的人數。
我知道這個刪除重複:如何將兩個數組與Ruby中的重複項匹配?
@email.distributions.map(&:zip_code) & CardSignup.all.map(&:zip_code)
但我想這樣做同樣的事情,在這裏我找到匹配任何東西,但它也表明我複製。
任何想法?
我正在嘗試查找簽署具有與我放置的郵政編碼首選項相匹配的郵政編碼的卡的人數。
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 ..)
什麼是這兩個數組的(近似)的大小?比另一個大得多嗎? – tokland 2011-03-18 16:53:53