我正在使用Rails 7創建一個員工管理系統應用程式。在這里,我有一個 Employee 模型,一個 Document 模型具有所有檔案的串列,這兩個模型通過 EmployeeDocuments 模型關聯,該模型具有 Employee ID 和 Document ID。現在我想使用行動郵件發送一份員工名單,其中包含他們尚未提交的檔案。問題是我無法獲得在單個查詢中提交了一些或沒有提交檔案的員工串列。我可以得到沒有提交檔案的員工,如下所示:
Employee.includes(:documents).where(documents: {id: nil})
部分或全部檔案由以下人員提交的員工:
Employee.includes(:documents).where.not(documents: {id: nil})
我想要這個串列,以便我可以通過以下方式遍歷他們丟失的檔案:
Document.where.not(id: employee.documents.pluck(:id))
并發送串列。目前,我的郵件看起來像這樣:
class DocsNotifierMailer < ApplicationMailer
default from: '[email protected]'
def notification_email
@employees = Employee.all
mail(to: '[email protected]',
subject: 'Reminder for missing documents')
end
end
所以我可以在我的 HTML 模板中獲取所有員工的串列,并且我正在使用這樣的 If 陳述句:
<% if employee.documents.length < Document.all.count %>
用所有檔案過濾掉員工。但我想在郵件本身中過濾它們。由于我是初學者,無法找到解決方法。請幫忙。
uj5u.com熱心網友回復:
我認為以下內容可能對您有用:
Employee
.left_outer_joins(:documents)
.group('employees.id')
.having("COUNT(documents.id) < #{Document.count}")
uj5u.com熱心網友回復:
Rails 7 內置了這個
Employee.where.associated(:documents)
閱讀更多相關資訊:https ://blog.saeloun.com/2021/02/15/rails-7-adds-query-method-associated-to-check-association-presence.html
uj5u.com熱心網友回復:
這些問題非常令人困惑,但是如果您有一個檔案串列并且想要查找與所有或部分記錄匹配的員工,您可以通過分組并使用必須在組上設定條件來做到這一點:
Employee
.left_joins(:documents)
.where(documents: { id: documents })
.group(:id)
# HAVING COUNT("documents"."id") < 7
.having(Document.arel_table[:id].count.lt(documents.size))
這將為沒有與所有檔案匹配但可能有一些檔案的用戶提供。可以通過使用 、 或代替(小于)來eq簡單地更改條件lteq。gtgteqlt
在 Postgres 上,您可以使用COUNT(documents.*):
.having(Document.arel_table[Arel.star].count.lt(documents.size))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/424105.html
