1

Say Benutzer A auf B verbunden ist, dann wird der Benutzer B automatisch mit Benutzer A zu verbindenden betrachtetWie erreicht man das Konzept der Verbindungsliste mit minimalen Kosten unter Verwendung von Schienen ActiveRecord?

Userhas_manyconnection

Verbindungstabelle:

id, user_id, connected_user_id

Say


id || user_id|| connected_user_id

1 || 1 || 2

2 || 3 || 1

3 || 2 || 3



Erwartetes Ergebnis:

User.find(1).connections

[< User: 2, ...>, < User: 3, ...>]

User.find(2).connections

[< User: 1, .. .>, < User: ... 3>]

Antwort

0

Wenn Sie eine many-to-many-Beziehung, die es klingt wie Sie tun, Sie has_many through relationship einrichten können :

class User < ApplicationRecord 
    has_many :connections 
    has_many :connected_users, through: :connections 
end 

class Connection < ApplicationRecord 
    belongs_to :user 
    belongs_to :connected_user, class_name: "User" 
end 

Dann alle Verbindungen zu finden, wie Sie möchten, eine Methode in Ihrer Benutzerklasse erstellen:

def get_connections 
    User.find(Connection.where(user_id: self.id).connected_user_ids + Connection.where(connected_user_id: self.id).user_ids) 
end 

User.find(1).get_connections sollte zurückkehren

[< User: 2. ..>, < Benutzer-ID: 3, ...>]

+0

warum connecte d_user_id wird als Referenz in der Benutzertabelle verwendet? – Manish

+0

@Manish Sie müssen eine Spalte "connected_user_id" zu Ihrer Benutzertabelle hinzufügen, um als Referenz auf die ID des anderen Benutzers zu dienen. Ich habe meine Antwort mit Beispielmigrationen aktualisiert, um dies zu tun. – CChandler81

+0

Glauben Sie nicht, dass es nicht der richtige Weg ist, da es mehrere Einträge für mehrere Verbindungen für den gleichen Benutzer erstellt? – Manish

Verwandte Themen