Pergunta

Estou usando o Intridea Atua como legível Plugin Rails para um sistema de mensagens que estou construindo atualmente.Eu defini minha classe de mensagem de acordo:

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

E tudo parece estar funcionando conforme o planejado, mas ao tentar fazer o aplicativo mostrar mensagens não lidas na minha visualização de mensagens, tenho problemas.

O exemplo deles:(Alterei sublinhados para hífens devido a problemas de formatação)

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

Parece que se eu quisesse listar o número de mensagens não lidas em uma caixa de correio (por exemplo Inbox (39) ), eu deveria ser capaz de fazer algo como:

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

Mas sem sucesso.Sempre pareço ficar preso nos problemas de visualização simples depois que tudo está definido.Alguma ideia?

Foi útil?

Solução

O seguinte funcionará

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

ou

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

No entanto, se você verificar seu development.log, verá que ele obtém a contagem de não lidos por

  1. Recuperando todas as postagens
  2. Recuperando todas as postagens lidas pelo usuário
  3. Removendo todos os 2.a partir de 1.em rubi

Isso terá um desempenho muito ruim em termos de muitas postagens.

Uma maneira melhor seria recuperar as postagens lidas pelo usuário atual e então usar ActiveRecord::Calculations para obter uma contagem sem recuperar todas as postagens no banco de dados

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

Isso deve entrar no seu modelo Post para seguir as práticas recomendadas de não ter localizadores na visualização ou no controlador

Post.rb

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

Então sua visão será apenas

<%= Post.unread_post_count_for_user(current-user) %>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top