'between'范围来自mailboxergem理解sql查询

5jvtdoz2  于 2021-07-24  发布在  Java
关注(0)|答案(0)|浏览(102)

我的rubyonrails应用程序使用mailboxergem作为内部消息传递系统。我想要更灵活的方法,所以我决定在我的应用程序中编写类似但简化的行为。然而,我被一些mailboxer代码卡住了。关于会话模型:mailboxer/app/models/mailboxer/conversation.rb
即“中间”范围:

scope :between, lambda {|participant_one, participant_two|
    joins("INNER JOIN (#{Mailboxer::Notification.recipient(participant_two).to_sql}) participant_two_notifications " \
          "ON participant_two_notifications.conversation_id = #{table_name}.id AND participant_two_notifications.type IN ('Mailboxer::Message')").
        joins("INNER JOIN mailboxer_receipts ON mailboxer_receipts.notification_id = participant_two_notifications.id").
        merge(Mailboxer::Receipt.recipient(participant_one)).
        order(updated_at: :desc).distinct
  }

例如,在rails控制台中运行:

user.mailbox.conversations.between(User.find(3), User.last)

正在创建以下查询:

SELECT DISTINCT "mailboxer_conversations".* FROM "mailboxer_conversations"
INNER JOIN "mailboxer_notifications" ON "mailboxer_notifications"."conversation_id" = "mailboxer_conversations"."id" AND "mailboxer_notifications"."type" = "Mailboxer::Message"
INNER JOIN "mailboxer_receipts" "receipts_mailboxer_conversations" ON "receipts_mailboxer_conversations"."notification_id" = "mailboxer_notifications"."id" 
INNER JOIN (
  SELECT "mailboxer_notifications".* FROM "mailboxer_notifications" 
  INNER JOIN "mailboxer_receipts" ON "mailboxer_receipts"."notification_id" = "mailboxer_notifications"."id" 
  WHERE "mailboxer_receipts"."receiver_id" = 12422 AND "mailboxer_receipts"."receiver_type" = 'User'
) participant_two_notifications ON participant_two_notifications.conversation_id = mailboxer_conversations.id AND participant_two_notifications.type IN ('Mailboxer::Message') 
INNER JOIN mailboxer_receipts ON mailboxer_receipts.notification_id = participant_two_notifications.id 
WHERE "mailboxer_notifications"."type" = "Mailboxer::Message" AND "mailboxer_receipts"."receiver_id" = 3 AND "mailboxer_receipts"."receiver_type" = "User" 
ORDER BY "mailboxer_conversations"."updated_at" DESC

请帮助我逐步了解activerecord范围查询和sql查询。最困难的部分是在sql中使用“participant\u two\u notifications”。谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题