Acts-as-as-readable плагин Rails Проблема - PullRequest
9 голосов
/ 22 августа 2008

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

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

1 Ответ

11 голосов
/ 22 августа 2008

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

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

или

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

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

  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) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...