Ad

How To Find Model Records Having Some Or No Associated Model Records In Rails?

- 1 answer

I am creating an Employee Management System app using Rails 7. Here I have one Employee model, one Document model having a list of all documents and these two are associated through the EmployeeDocuments model which has Employee ID and Document ID. Now I want to use an action mailer to send a list of employees with documents they have not submitted. The problem is I cannot get the Employee list with some or no documents submitted in a single query. I can get Employees with no submitted documents like this:

Employee.includes(:documents).where(documents: {id: nil})

and Employees with some or all documents submitted by:

Employee.includes(:documents).where.not(documents: {id: nil})

I want the list so that I can iterate through their missing documents by:

Document.where.not(id: employee.documents.pluck(:id))

and send the list. Currently, my mailer looks like this:

class DocsNotifierMailer < ApplicationMailer
  default from: '[email protected]'

  def notification_email 
    @employees = Employee.all      
    mail(to: '[email protected]', 
      subject: 'Reminder for missing documents')   
  end 
end

So I can get the list of all employees in my HTML template and there I am using an If statement like this:

<% if employee.documents.length < Document.all.count %>

to filter out the employees with all documents. But I want to filter them in the mailer itself. Since I am a beginner, can not find a way out of this. Please help.

Ad

Answer

I think the following might work for you:

Employee
  .left_outer_joins(:documents)
  .group('employees.id')
  .having("COUNT(documents.id) < #{Document.count}")
  
Ad
source: stackoverflow.com
Ad