Вопрос

Я использую Intridea's Действует как Читаемый Плагин Rails для системы обмена сообщениями, которую я сейчас создаю.Я соответствующим образом определил свой класс сообщений:

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

И вроде бы все работает по плану, но при попытке заставить приложение показывать непрочитанные сообщения в моем представлении сообщений я сталкиваюсь с проблемами.

Их пример:(Я изменил подчеркивания на дефисы из-за проблем с форматированием)

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

Таким образом, кажется, что если бы я хотел перечислить количество непрочитанных сообщений, находящихся в почтовом ящике (например, Inbox (39) ), я мог бы сделать что-то вроде:

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

Но безрезультатно.Кажется, я всегда застреваю на проблемах с простым просмотром после того, как все настроено.Есть какие-нибудь идеи?

Это было полезно?

Решение

Будет работать следующее

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

или

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

Однако, если вы проверите свою разработку.журнал, вы должны увидеть, что он получает количество непрочитанных по

  1. Получение всех сообщений
  2. Получение всех сообщений, прочитанных пользователем
  3. Удаление всех из 2.от 1.в ruby

Это будет очень плохо с точки зрения производительности при большом количестве сообщений.

Лучшим способом было бы получить записи, прочитанные текущим пользователем, а затем использовать ActiveRecord::Calculations для получения подсчета без извлечения всех записей в базе данных

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

Это должно быть включено в вашу модель Post, чтобы следовать рекомендациям по отсутствию средств поиска в представлении или контроллере

Post.rb

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

Тогда ваш взгляд будет просто таким

<%= Post.unread_post_count_for_user(current-user) %>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top