如何将此 SQL 查询转换为 Active Record 语句,有很多答案都不能帮助我?

How do I convert this SQL query into Active Record statements, there are many answers those are not help me out?

查询如下:

SELECT
  DISTINCT
  ((substring(r2.email FROM position('@' IN r2.email) + 1))) AS unknown_domain,
  count(DISTINCT (c2.id)) as contact_count,
  count(DISTINCT (dc.id)) as dc_count
FROM
  (SELECT
     unnest(emails) AS email,
     id
   FROM contacts c
   WHERE account_id = 612) AS r2
INNER JOIN domains d
    ON d.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))
INNER JOIN contacts c2
    on c2.id = r2.id
INNER JOIN device_contacts dc
  on dc.contact_id = c2.id
where d.freebie = 'f'
      AND (NOT exists(SELECT 1
                      FROM (SELECT unnest(email_domains) :: CHARACTER VARYING AS domain
                            FROM companies) AS results
                      WHERE results.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))))
      AND (defunct = FALSE OR defunct IS NULL)
      AND (dc.emails && ARRAY[r2.email]::character varying[])
GROUP BY unknown_domain
ORDER BY dc_count DESC, contact_count DESC;

虽然我不知道如何将其转换为活动记录查询。我看过许多 rails 个网站。我完全不知道如何处理这个问题。我尝试了几次不同的尝试,但都失败了。

如果 SQL 有效,您无需经历不必要的痛苦来转换它...您可以按原样使用它。使用一个heredoc将其加载到一个变量中,并调用连接#execute

my_sql <<SQL_STRING
SELECT
  DISTINCT
  ((substring(r2.email FROM position('@' IN r2.email) + 1))) AS unknown_domain,
  count(DISTINCT (c2.id)) as contact_count,
  count(DISTINCT (dc.id)) as dc_count
FROM
  (SELECT
     unnest(emails) AS email,
     id
   FROM contacts c
   WHERE account_id = 612) AS r2
INNER JOIN domains d
    ON d.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))
INNER JOIN contacts c2
    on c2.id = r2.id
INNER JOIN device_contacts dc
  on dc.contact_id = c2.id
where d.freebie = 'f'
      AND (NOT exists(SELECT 1
                      FROM (SELECT unnest(email_domains) :: CHARACTER VARYING AS domain
                            FROM companies) AS results
                      WHERE results.domain = ((substring(r2.email FROM position('@' IN r2.email) + 1)))))
      AND (defunct = FALSE OR defunct IS NULL)
      AND (dc.emails && ARRAY[r2.email]::character varying[])
GROUP BY unknown_domain
ORDER BY dc_count DESC, contact_count DESC;
SQL_STRING

my_records = ActiveRecord::Base.connection.execute(my_sql)