`where.missing`과의 연결이 누락된 레코드 찾기
원시 SQL의 경우 특정 연결이 없는 레코드를 찾기 위해
LEFT OUTER JOIN
검사와 결합된 null
를 사용할 수 있습니다.용법
Rails에서는 SQL의 동일한 개념을 ActiveRecord로 직접 적용할 수 있습니다.
다음 모델이 있다고 가정해 보겠습니다.
class Account < ApplicationRecord
has_many :recovery_email_addresses
end
아직 백업 복구 이메일을 설정하지 않은
Account
을(를) 찾으려는 경우 다음 쿼리를 작성할 수 있으며 모든 것이 잘 작동합니다.Account.left_joins(:recovery_email_addresses).where(recovery_email_addresses: { id: nil })
# SELECT "accounts".* FROM "accounts" LEFT OUTER JOIN "recovery_email_addresses" ON "recovery_email_addresses"."account_id" = "accounts"."id" WHERE "recovery_email_addresses"."id" IS NULL
하지만 좀 장황합니다. Rails 6.1부터 동일한 쿼리를 작성하기 위해 훨씬 깔끔한 속기를 사용할 수 있습니다.
Account.where.missing(:recovery_email_addresses)
# SELECT "accounts".* FROM "accounts" LEFT OUTER JOIN "recovery_email_addresses" ON "recovery_email_addresses"."account_id" = "accounts"."id" WHERE "recovery_email_addresses"."id" IS NULL
이것은 동일한 SQL을 생성하고 읽기가 훨씬 쉽습니다.
belongs_to
관계에서도 이 기능을 사용할 수 있습니다.class Contract < ApplicationRecord
belongs_to :promiser, class_name: "User"
belongs_to :promisee, class_name: "User"
belongs_to :beneficiary, optional: true, class_name: "User"
end
Contract.where.missing(:promiser) # Contracts without a promiser
Contract.where.missing(:promiser, :beneficiary) # Contracts without a promiser AND beneficiary
일반 ActiveRecord 연결 방법과 결합
missing
할 수도 있습니다.Contact.where("amount > ?", 1200).where.missing(:promiser)
Contact.where(signed: true).where.missing(:beneficiary)
추가 리소스
레일 저장소: Finding Orphan Records
Rails API 문서: WhereChain#missing
Reference
이 문제에 관하여(`where.missing`과의 연결이 누락된 레코드 찾기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/swanson/find-records-missing-an-association-with-where-missing-25p1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)