2017-01-13 4 views
0

In meiner Anwendung kann ich mehrere Konten haben und Konten können mehrere E-Mails haben. Ich habe eine Methode, die alle einzigartigen E-Mails von jedem Konto zählt, aber das ist nicht was ich will.So erhalten Sie mehrere Werte eines Datensatzes mit Karte

Stattdessen möchte ich alle die eindeutige E-Mail von nur einem Konto NICHT alle, wie die Methode gerade tut.

Hier ist meine aktuelle Methode:

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 

Dies wird wieder die ganze E-Mail, die von allen Konten einzigartig ist. Ich möchte alle eindeutigen E-Mails für jedes Konto zurückgeben, sodass Konto 1 vier eindeutige E-Mails enthalten kann und Konto 2 fünf eindeutige E-Mails enthalten kann.

+0

Verwendung Gruppe von http://guides.rubyonrails.org/active_record_querying.html#total-of-grouped-items –

+2

(1) Was tut die Daten sehen aus wie in der Datenbank? Tabellenschema, Beziehungen, ... (2) Speichern Sie wirklich kommagetrennte Listen von E-Mail-Adressen in einem einzigen Feld? Wenn Sie es sind, ist der erste Schritt, damit aufzuhören, diese Art von Anti-Muster wird Ihr Leben einfach miserabel machen. –

+2

Bitte lesen Sie "[mcve]". Wir benötigen die minimalen Eingabedaten und Ihre erwartete Ausgabe. Ohne das müssen wir die Daten zurückentwickeln und dann raten, ob die Ausgabe korrekt ist, was unsere Zeit verschwendet. –

Antwort

2

Es klingt wie Sie sagen, Sie möchten eine einzige Methode, die Ihnen alle eindeutigen E-Mails für jeweils Konto gibt. Wenn ich Sie verstehen, würde ich so etwas tun:

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

Eager Laden 'Benutzer' könnte ein Fehler hier sein, wenn es viele Benutzer für einige Konten gibt. Nur das erste scheint notwendig zu sein. – tadman

+0

Fair genug - ich entfernte die eifrige Ladung. Ich denke, ich habe mir nicht viele Benutzer in einem Account vorgestellt, aber es könnte sicherlich Fälle dafür geben. –

+0

Ich gehe immer davon aus, dass es eine Milliarde von irgendeiner bestimmten Verbindung geben wird, um * alles * nicht aus Faulheit oder Bequemlichkeit zu laden. Manchmal ist die Wahrheit viel näher an einer Milliarde, als du realisierst. Das sieht in seiner jetzigen Form ziemlich gut aus, es sollte unter den meisten Umständen gut funktionieren. – tadman

Verwandte Themen