2016-08-14 71 views
1

我正在使用Paranoia寶石,現在正在與問題糾纏在一起。我需要加入has_many已刪除的項目,但它不會被刪除。我的模型:Paranoia寶石 - 加入已刪除的項目

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 

查詢我運行應與已刪除項目返回mailings

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

我到目前爲止發現的唯一可行的解​​決方案是手動指定JOIN:

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