2016-08-14 3 views
1

나는 편집증 보석을 사용하고 있으며 현재이 문제로 어려움을 겪고 있습니다. has_many 삭제 된 항목을 조인해야하지만 삭제 된 항목 만 반환합니다. 내 모델 : 나는 삭제 된 항목에 mailings을 반환해야하는 중이에요낙서 젬 - 삭제 된 항목과 결합

class Mailing < ActiveRecord::Base 

    acts_as_paranoid 

    has_many :mailing_fields 
    has_many :fields, through: :mailing_fields 

end 

class MailingField < ActiveRecord:: 

    belongs_to :mailing 
    belongs_to :field 

end 

class Field < ActiveRecord::Base 

    has_many :mailing_fields, dependent: :destroy 
    has_many :mailings, through: :mailing_fields 

end 

쿼리 :

Field.joins(:mailings).where('mailings.id = ?', mailing_id) 

답변

1

편집 성 보석에는 삭제 된 항목에 액세스 할 수있는 범위가 내장되어 있습니다 : with_deleted.

Mailing.with_deleted.joins(:fields).where(id: mailing_id) 
1

paranoid 보석은 쿼리에서 삭제되지 않은 항목을 포함하는 기본 범위를 설정합니다. 해결 방법은 다음과 같습니다

Field.joins(:mailings).where('mailings.id = ? mailings.deleted_at != ?', mailing_id, nil) 
1

당신은 같은 쿼리에 범위를 제거 할 수 있습니다 :

Field.joins(:mailings).where("mailings.deleted_at != :deleted_status OR mailings.deleted_at = :deleted_status", deleted_status: nil).where(mailings: { id: mailing_id }) 

을 또는 당신이 많은 관계로 많은 것 같다 Field를 가져 오기 위해 노력하고 있기 때문에, 쿼리를 이와 반대로 뒤집는 것을 선호합니다.

Mailing.unscoped.joins(:fields).find(mailing_id).fields 

도움을받을 수 있는지 알려주세요.

0

내가 지금까지 찾은 유일한 작업 솔루션을 수동으로 지정하는 것입니다 가입 :

Field.joins('INNER JOIN "mailings" ON "mailings"."id" = "fields"."mailing_id"') 
    .where('mailings.id = ?', mailing_id)