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?

War es hilfreich?

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

  1. Alle Beiträge werden abgerufen
  2. Abrufen aller vom Benutzer gelesenen Beiträge
  3. 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) %>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top