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?

È stato utile?

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

  1. Recupero di tutti i post
  2. Recupero di tutti i post letti dall'utente
  3. 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) %>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top