2017-01-13 35 views
0

在我的應用程序可以擁有多個賬戶及賬戶可以有多個電子郵件。我有一個方法來計算每個帳戶的所有獨特的電子郵件,但這不是我想要的。如何獲得創紀錄的多個值地圖

相反,我想從一個帳戶返回所有唯一的電子郵件不是全部​​,因爲該方法目前正在做。

這裏是我當前的方法:

class AccountEmails 
    def self.count 
    accounts = Account.all 

    alert = accounts.map do |a| 
     a.users.first.alert_email.split(",") 
    end 

    billing = accounts.map do |a| 
     a.users.first.billing_email.split(",") 
    end 

    user = accounts.map do |a| 
     a.users.first.email.split(",") 
    end 

    snitch = accounts.map do |a| 
     a.snitches.map { |s| s.alert_email.split(",") } 
    end 

    [alert, billing, user, snitch].flatten.uniq.count 
    end 
end 

這將返回所有來自所有帳戶唯一的電子郵件。我想要爲每個帳戶返回所有唯一的電子郵件,因此帳戶1可以有四個唯一的電子郵件,帳戶2可以有五個唯一的電子郵件。

+0

使用GROUP BY http://guides.rubyonrails.org/active_record_querying.html#total-of-grouped-items –

+2

(1)是什麼數據看起來像在數據庫中?表格模式,關係,...(2)您是否真的在單個字段中存儲逗號分隔的電子郵件地址列表?如果你是,你的第一步是停止這樣做,那種反模式只會讓你的生活變得悲慘。 –

+2

請閱讀「[mcve]」。我們需要最小的輸入數據和您的預期輸出。沒有這些,我們必須對數據進行反向工程,然後猜測輸出是否正確,這是浪費我們的時間。 –

回答

2

這聽起來像你說你想要一種方法,爲您提供每個帳戶的所有獨特的電子郵件。如果我理解你,我會做這樣的事情:

class Account 
    def all_emails 
    # I'm assuming here that you actually only want the unique 
    # emails on the first user for each account 
    user = self.users.first 
    [ 
     user.alert_email.split(","), 
     user.billing_email.split(","), 
     user.email.split(","), 
     self.snitches.map{|snitch| snitch.alert_email.split(",") } 
    ].flatten 
    end 

    def unique_emails 
    all_emails.uniq 
    end 
end 

class AccountEmails 
    def self.unique 
    Account.all.includes(:snitches).map do |account| 
     account.uniq_emails 
    end 
    end 

    def self.count 
    uniq.flatten.count 
    end 
end 
+0

預先加載'users'可能,如果有很多用戶在某些賬戶這裏是一個錯誤。只有第一個似乎是必要的。 – tadman

+0

公平 - 我刪除了熱切的加載。我想我並沒有想象帳戶中有很多用戶,但肯定會有這種情況。 –

+0

我總是假設有將是任何特定關聯的十億以便不加載* *一切出於懶惰或者方便的。有時真相比你意識到的要接近10億。這在目前的形式看起來很不錯,在大多數情況下它應該表現得很好。 – tadman