2016-08-14 73 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)