Actes-comme-lisible Rails plugin Problème
-
09-06-2019 - |
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?
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
- Récupération de tous les postes
- Retrouver tous les articles lus par l'utilisateur
- 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) %>