Проблема с плагином для чтения Rails
-
09-06-2019 - |
Вопрос
Я использую 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 %>
Однако, если вы проверите свою разработку.журнал, вы должны увидеть, что он получает количество непрочитанных по
- Получение всех сообщений
- Получение всех сообщений, прочитанных пользователем
- Удаление всех из 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) %>