我的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”。谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!