2017-02-08 4 views
0

Ich habe ein Benutzermodell (has_many Kontakte) und ein Kontaktmodell (gehört zu Benutzer). Um Einladungen zu senden, muss ich wissen, ob die Kontakte eines Benutzers bereits in der Benutzertabelle vorhanden sind, und ein Statusfeld in Kontakte aktualisieren. Mein allgemeines Feld ist die Telefonnummer.Schienen Update-Feld basierend auf finden in einer anderen Tabelle

So vereinfachend ich habe:

Benutzer: id, Telefon

Kontakt: ID, Name, Telefon, Status, user_id

Wie kann ich Status gesetzt "registriert", um für einen Kontakt des Benutzers auf effiziente Weise?

Im Moment habe ich diese Iteration, die funktioniert, aber es muss ein besserer Weg sein:

all_contacts = Contact.where(user_id: user).where.not(phone: nil) 
all_contacts.each do |contact| 
    a = User.find_by(phone: contact.phone) 
    if a 
    contact.status = 'registered' 
    contact.save 
    end 
end 

Antwort

1

können Sie versuchen, folgende:

contacts = Contact.joins(:user).where("users.phone=contacts.phone and contacts.phone not NULL") 
contact_ids = fetch ids from contacts array 
Contact.update(your_array_of_ids, status: "registered") 
+0

Vielen Dank! Genau das habe ich gesucht. Auf diese Weise ist keine Iteration erforderlich. Die Join- und Where-Klausel behandelt die Suche nach Kontakten, die als Benutzer registriert sind. Datenbanken sind bei solchen Dingen sehr effizient, wenn sie Indizes und Speicher verwenden. – Augusto

0

Wenn Sie Status des Benutzers aktualisieren mögen nur „registriert“, wenn sie eine Telefonnummer haben, dann Sie könnten ihre IDs in einem Array speichern (where zum Beispiel verwendet wird, und dann könnte man die update Methode wie folgt verwenden:

User.update(your_array_of_ids, status: "registered") 
+0

Ich denke, Sie haben die Frage missverstanden. Ich möchte den Status jedes Kontakts aktualisieren, wenn die Telefonnummer des Kontakts in der Benutzer-Tabelle existiert – Augusto

Verwandte Themen