【问题标题】:ActiveRecord query to avoid needing of additional processing of the resultsActiveRecord 查询以避免需要对结果进行额外处理
【发布时间】:2015-07-02 18:39:41
【问题描述】:

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

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

这意味着我需要找到与 deactivated_on 不为零的相关电子邮件的工作,并且也没有 deactivated_on 为 nil 的相关电子邮件。 (deactivated_on 是一个日期)

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

如有必要,我对 ActiveRecord 或原始 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 为 nil 的电子邮件以及 deactivated_on 不为 nil 的电子邮件相关联的就业对象。

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

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      相关资源
      最近更新 更多