Problema del plugin Rails che funziona come leggibile
-
09-06-2019 - |
Domanda
Sto usando Intridea Agisce come leggibile Plugin Rails per un sistema di messaggistica che sto attualmente costruendo.Ho definito la mia classe di messaggio di conseguenza:
class Post < ActiveRecord::Base
acts-as-readable
end
E tutto sembra funzionare secondo i piani, ma quando provo a far sì che l'app mostri i messaggi non letti nella visualizzazione dei messaggi, riscontro dei problemi.
Il loro esempio:(Ho cambiato i caratteri di sottolineatura in trattini a causa di problemi di formattazione)
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>]
Quindi sembra che se volessi elencare il numero di messaggi non letti presenti in una casella di posta (ad esempio Inbox (39) ), dovrei essere in grado di fare qualcosa del tipo:
<%= Post.find_unread_by(current-user).count %>
Ma inutilmente.Mi sembra sempre di rimanere bloccato sui semplici problemi di visualizzazione dopo che tutto è stato impostato.Qualche idea?
Soluzione
Quanto segue funzionerà
<%= Post.find_unread_by(current_user).size %>
O
<%= Post.find_unread_by(current_user).length %>
Tuttavia, se controlli il tuo development.log dovresti vedere che ottiene il conteggio dei non letti
- Recupero di tutti i post
- Recupero di tutti i post letti dall'utente
- Eliminando tutti e 2.da 1.nel rubino
Questo sarà pessimo in termini di prestazioni con molti post.
Un modo migliore sarebbe recuperare i post letti dall'utente corrente e quindi utilizzare ActiveRecord::Calculations per ottenere un conteggio senza recuperare tutti i post nel database
Post.count(:conditions => [ "id NOT IN (?)", Post.find_read_by(current_user)])
Questo dovrebbe entrare nel tuo modello Post per seguire le migliori pratiche per non avere i cercatori nella vista o nel controller
Posta.rb
def self.unread_post_count_for_user(user)
count(:conditions => [ "id NOT IN (?)", Post.find_read_by(user)])
end
Allora la tua vista sarà semplicemente
<%= Post.unread_post_count_for_user(current-user) %>