Acts-as-as-readable плагин Rails Проблема

Я использую плагин Intridea Acts as Readable 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 %>

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

22.08.2008 17:37:51
1 ОТВЕТ
РЕШЕНИЕ

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

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

или

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

Однако, если вы проверите свой файл development.log, вы увидите, что он получает число непрочитанных

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

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

Лучшим способом было бы получить сообщения, прочитанные текущим пользователем, а затем использовать 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) %>
11
24.08.2008 23:58:52