Problem mit dem lesbaren Rails-Plugin
-
09-06-2019 - |
Frage
Ich verwende Intridea Wirkt als lesbar Rails-Plugin für ein Messaging-System, das ich gerade baue.Ich habe meine Nachrichtenklasse entsprechend definiert:
class Post < ActiveRecord::Base
acts-as-readable
end
Und alles scheint nach Plan zu funktionieren, aber wenn ich versuche, die App dazu zu bringen, ungelesene Nachrichten in meiner Nachrichtenansicht anzuzeigen, stoße ich auf Probleme.
Ihr Beispiel:(Aufgrund von Formatierungsproblemen habe ich Unterstriche in Bindestriche geändert.)
bob = User.find_by_name("bob")
bob.readings # => []
Post.find_unread_by(bob) # => [<Post 1>,<Post 2>,<Post 3>...]
Post.find_read_by(bob) # => []
Post.find(1).read_by?(bob) # => false
Post.find(1).read_by!(bob) # => <Reading 1>
Post.find(1).read_by?(bob) # => true
Post.find(1).users_who_read # => [<User bob>]
Post.find_unread_by(bob) # => [<Post 2>,<Post 3>...]
Post.find_read_by(bob) # => [<Post 1>]
bob.readings # => [<Reading 1>]
Wenn ich also die Anzahl der ungelesenen Nachrichten in einem Postfach (z. B. Inbox (39)) auflisten möchte, sollte ich in der Lage sein, Folgendes zu tun:
<%= Post.find_unread_by(current-user).count %>
Aber ohne Erfolg.Ich scheine immer bei den einfachen Ansichtsproblemen hängenzubleiben, nachdem alles eingestellt ist.Irgendwelche Ideen?
Lösung
Folgendes wird funktionieren
<%= Post.find_unread_by(current_user).size %>
oder
<%= Post.find_unread_by(current_user).length %>
Wenn Sie jedoch Ihr development.log überprüfen, sollten Sie feststellen, dass dort die Anzahl der ungelesenen Dateien angezeigt wird
- Alle Beiträge werden abgerufen
- Abrufen aller vom Benutzer gelesenen Beiträge
- Alle 2 entfernen.ab 1.in Rubin
Bei vielen Beiträgen wird die Leistung sehr schlecht sein.
Eine bessere Möglichkeit wäre, die vom aktuellen Benutzer gelesenen Beiträge abzurufen und dann ActiveRecord::Calculations zu verwenden, um eine Zählung zu erhalten, ohne alle Beiträge in der Datenbank abzurufen
Post.count(:conditions => [ "id NOT IN (?)", Post.find_read_by(current_user)])
Dies sollte in Ihr Post-Modell aufgenommen werden, um Best Practices zu befolgen, damit keine Finder in der Ansicht oder im Controller vorhanden sind
Post.rb
def self.unread_post_count_for_user(user)
count(:conditions => [ "id NOT IN (?)", Post.find_read_by(user)])
end
Dann wird Ihre Ansicht einfach sein
<%= Post.unread_post_count_for_user(current-user) %>