Ich versuche zu verhindern, dass Benutzer doppelte Chatrooms erstellen (Chatroom umfasst 2 Benutzer). Aber ich habe keine Ahnung, wie man validiert, ob Chatroom mit den gleichen Benutzern bereits vor dem Speichern existiert. Rails validieren verknüpfte Modelle
Das ist meine Methode in Chatroom-Controller erstellen:
def create
@chatroom = Chatroom.new
@friend = User.where(username: params[:friend]).last
@chatroom.chatroom_users.build(user: @friend, chatroom: @chatroom)
@chatroom.chatroom_users.build(user: current_user, chatroom: @chatroom)
if @chatroom.save
flash[:notice] = "chatrooom created"
redirect_to @chatroom
else
flash[:notice] = "chatrooom not created lol"
redirect_to authenticated_root_path
end
end
Und das ist, wie ich sich zu validieren versuchen, wenn kein Chatroom mit 2 Benutzern wie die neuen ist:
In meiner Klasse Chatroom
after_save :duplicate?
# Checks if chatroom containing specific users exists.
def duplicate?
user = self.users.first
friend = self.users.second
# lines below work fine - they check if there is already such chatroom
(Chatroom.all - [self]).each do |chatroom|
if ((chatroom.users & [user, friend]) - [user, friend]).empty?
self.errors.add(:chatroom, "Such chatroom already exists.")
end
end
end
Das Problem ist: wenn ich after_save
in validatin verwenden g Methode kann ich die self.users.first Benutzer- und Freund Variablen setzen, aber dann hört es nicht von der Erstellung dieses Datensatzes und ich bin mir nicht sicher, ob es eine gute Idee ist, wenn es löschen. Zweitens - ich verwende validate
anstelle von after_save
self.users.first und self.users.second gibt nil zurück, damit ich nicht nach Duplikaten suchen kann.
PS: Ich möchte nicht Benutzer-ID als die Attribute in der Chatrooms-Tabelle haben, weil ich die Fähigkeit hinzufügen möchte, um für so viele PPL, wie Sie wollen, zu chatten verbinden.
sicher 'self.users.first' und' self.users.second' sind gleich Null vor Speichern, aber können Sie stattdessen nicht 'user_id' validieren? – kasperite