Problema do plugin Rails que atua como legível
-
09-06-2019 - |
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?
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
- Recuperando todas as postagens
- Recuperando todas as postagens lidas pelo usuário
- 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) %>