Sql ActiveRecord查询,以避免对结果进行额外处理

Sql ActiveRecord查询,以避免对结果进行额外处理,sql,ruby-on-rails,ruby,postgresql,activerecord,Sql,Ruby On Rails,Ruby,Postgresql,Activerecord,我有两种模式:就业和电子邮件。就业有很多:电子邮件,电子邮件属于:就业 我需要找到没有工作电子邮件的工作 这意味着我需要找到有相关电子邮件的员工,其中deactivated_on不是零,也没有相关电子邮件,其中deactivated_on是零。(启用日期是一个日期) 我可以找到所有有电子邮件的员工,其中deactivated_on为零,然后在ruby中遍历每个员工的电子邮件,只返回没有电子邮件的员工,其中deactivated_on为零。但是我希望一定有一种方法可以编写一个查询来实现这个结果 如

我有两种模式:就业和电子邮件。就业有很多:电子邮件,电子邮件属于:就业

我需要找到没有工作电子邮件的工作

这意味着我需要找到有相关电子邮件的员工,其中deactivated_on不是零,也没有相关电子邮件,其中deactivated_on是零。(启用日期是一个日期)

我可以找到所有有电子邮件的员工,其中deactivated_on为零,然后在ruby中遍历每个员工的电子邮件,只返回没有电子邮件的员工,其中deactivated_on为零。但是我希望一定有一种方法可以编写一个查询来实现这个结果

如有必要,我愿意使用ActiveRecord或原始sql

我目前有:

class Employment < ActiveRecord::Base
  has_many :emails

  def no_working_emails
    joins(:emails).where.not(emails: { deactivated_on: nil }).uniq
  end
end
class Employment
这将导致与电子邮件关联的雇用对象中,停用的\u on为零,以及停用的\u on为非零的电子邮件

我需要删除的雇员,也有电子邮件,其中已停用的_上不是零


我一直在使用from或子查询进行研究。但到目前为止,我无法摆脱那些有活动电子邮件地址的员工。

类似于以下的查询应该可以帮助您获得所有没有活动电子邮件的员工的ID

ActiveRecord::Base.connection.select_all <<-SQL
  select e.id
  from employments e
  where not exists (
    select 1
    from emails em
    where em.employment_id=e.id
      and em.deactivated_on = null
  );
SQL
ActiveRecord::Base.connection.select\u all