开发者

Scope records which don't have an associated record

开发者 https://www.devze.com 2022-12-07 17:17 出处:网络
I have a chat function in my app. Chat::Messages are "read" by a user when an Chat::Message::Interaction exits for that message and that user.

I have a chat function in my app. Chat::Messages are "read" by a user when an Chat::Message::Interaction exits for that message and that user.

When a user opens the chat, I want to mark all unread messages as read in a background job. I'm finding the unread messages by doing chat.message.unread(user). This uses the unread scope on the message model pulls every chat message from the database.

Is there a better way of getting all messages for a chats which don't have an interaction for a specific user?

class Chat::Message::Interaction < ApplicationRecord
  belongs_to :user
  belongs_to :message
  delegate :chat, to: :message

  validates :user, uniqueness: { scope: :message }
end
class Chat::Message < ApplicationRecord
开发者_开发问答  belongs_to :user
  belongs_to :chat
  has_many :interactions, dependent: :destroy
  has_noticed_notifications

  default_scope { includes(:user) }

  scope :unread, ->(user) { where.not(id: Chat::Message::Interaction.where(user:).pluck(:message_id)) }

  def read?(user)
    interactions.find_by(user:).present?
  end
0

精彩评论

暂无评论...
验证码 换一张
取 消