Question

Je suis en utilisant Intridea de l' Agit comme Lisible Rails de plugin pour un système de messagerie, je suis actuellement en train de construire.J'ai défini ma classe de message en conséquence:

class Post < ActiveRecord::Base
  acts-as-readable
end

Et tout semble fonctionner selon le plan, mais lorsque j'essaie de faire l'app afficher les messages non lus dans mes messages, je rencontre des problèmes.

Leur exemple:(J'ai changé les traits de soulignement pour les traits d'union en raison de problèmes de mise en forme)

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>]

Il semble donc que si je voulais à la liste le nombre de messages non lus assis dans une boîte aux lettres (par exemple la Boîte de réception (39) ), je devrais être capable de faire quelque chose comme:

<%= Post.find_unread_by(current-user).count %>

Mais en vain.J'ai toujours l'impression de se retrouver coincé sur la simple vue des questions après, tout est réglé.Des idées?

Était-ce utile?

La solution

Ce qui suit fonctionnera

<%= Post.find_unread_by(current_user).size %>

ou

<%= Post.find_unread_by(current_user).length %>

Toutefois, si vous vérifiez votre développement.journal vous devriez voir qu'il obtient non lus compter par

  1. Récupération de tous les postes
  2. Retrouver tous les articles lus par l'utilisateur
  3. Suppression de tous les de 2.à partir de 1.en ruby

Ce sera une très mauvaise performance de la sagesse avec beaucoup de messages.

Une meilleure façon serait de récupérer les messages lus par l'utilisateur actuel, puis utiliser ActiveRecord::Calculs pour obtenir un nombre sans la récupérer tous les messages dans la base de données

Post.count(:conditions => [ "id NOT IN (?)", Post.find_read_by(current_user)])

Ce qui devrait aller dans votre Post, le modèle à suivre les meilleures pratiques de ne pas avoir d'intermédiation dans le point de vue d'un contrôleur ou d'

Post.rb

def self.unread_post_count_for_user(user)
  count(:conditions => [ "id NOT IN (?)", Post.find_read_by(user)])
end

Ensuite, votre vue sera juste

<%= Post.unread_post_count_for_user(current-user) %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top