ActiveRecord查询以避免需要对结果进行额外处理

时间:2015-07-02 18:39:41

标签: sql ruby-on-rails ruby postgresql activerecord

我有两种模式:就业和电子邮件。就业has_many:电子邮件和电子邮件belongs_to:就业。

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

这意味着我需要查找具有相关电子邮件的工作,其中deactivated_on不是nil,并且没有相关的电子邮件,其中deactivated_on为零。 (deactivated_on是日期)

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

如果需要,我对ActiveRecord或raw sql开放。

我目前有:

class Employment < ActiveRecord::Base
  has_many :emails

  def no_working_emails
    joins(:emails).where.not(emails: { deactivated_on: nil }).uniq
  end
end

这会导致与电子邮件相关联的就业对象,其中deactivated_on为零,还有电子邮件,其中deactivated_on不为零。

我需要删除也包含deactivated_on不为零的电子邮件的工作。

我一直在研究使用grouphaving或使用from的子查询。但到目前为止,我无法通过有效的电子邮件地址摆脱这些工作。

1 个答案:

答案 0 :(得分:1)

类似于以下内容的查询应该可以帮助您获取所有没有活动电子邮件的就业的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