Можно ли использовать драгоценный камень непрочитанным с общественным активом?

В настоящее время я использую гем "Публичная активность", и в представлении у меня отфильтровано действие пользователей, чтобы показывать только тому пользователю действия, которые к ним относятся, например, "Джон Смит прокомментировал ваше сообщение". Тем не менее, я хотел бы добавить уведомления к этому, например, Facebook или Twitter, где значок показывает номер, и когда вы видите канал, значок исчезает.

Я нашел драгоценный камень под названием Unread, который выглядит идеально, за исключением того, что требует добавления acts_as_readable :on => :created_at к вашей модели, и, поскольку я использую гем public_activity, класс не доступен для добавления этого.

Можно ли вставить код, который требуется непрочитанному гему, в класс PublicActivity:Activity?

Ссылки:

драгоценный камень public_activity: https://github.com/pokonski/public_activity

камень непрочитанный: https://github.com/ledermann/unread

2 ответа

Решение

Для тех, кто может найти это в будущем, я реализовал совершенно другую систему, моделируя свои собственные уведомления. Вместо того, чтобы использовать публичную активность и непрочитанные, я создал новую модель под названием уведомления. Это было столбцы:

    recipient:integer
    sender:integer
    post_id:integer
    type:string
    read:boolean

Затем, всякий раз, когда у меня был пользовательский комментарий или что-то подобное, я строил новое уведомление в контроллере, передавая следующую информацию:

    recipient = @post.user.id
    sender = current_user.id
    post_id = @post.id
    type = "comment"    # like, or comment etc
    read = false        # read is false by default

В панели навигации я просто добавил значок, который подсчитывал непрочитанные уведомления current_users, основываясь на переменной контроллера приложения.

    @unreadnotifications = current_user.notifications.where(read: false)

    <% if @unreadnotifications.count != 0 %>
        (<%= @unreadnotifications.count %>)
    <% end %>

Затем в контроллере уведомлений у меня было запустить mark_as_read действие на вид. Затем установите счетчик уведомлений обратно на 0.

    before_action :mark_as_read

    def mark_as_read
        @unread = current_user.notifications.where(read: false)
        @unread.each do |unread|
            unread.update_attribute(:read, true)
        end
    end

На самом деле можно добавить дополнительные вещи к PublicActivity::Class как это:

Добавить этот файл под названием public_activity.rb в config/initializers,

PublicActivity::Activity.class_eval do
  acts_as_readable :on => :created_at

  def self.policy_class
    ActivityPolicy
  end
end

Я также включил туда фрагмент для любого, кто использует Pundit с Public Activity, чтобы вы могли просто иметь activity_policy.rb файл политики.

ПРИМЕЧАНИЕ. Обязательно используйте последнюю версию Public Activity, включающую эту строку: https://github.com/chaps-io/public_activity/blob/1-5-stable/lib/public_activity/orm/active_record/activity.rb#L9 потому что без base_class установить, непрочитанный будет использовать неправильное полиморфное имя класса.

Другие вопросы по тегам