5

我正在使用Paranoia gem,现在正在努力解决这个问题。我需要加入 has_many已删除的项目,但它只返回不删除。我的模型:

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)
4

5 回答 5

7

到目前为止,我发现的唯一可行的解​​决方案是手动指定 JOIN:

Field.joins('INNER JOIN "mailings" ON "mailings"."id" = "fields"."mailing_id"')
     .where('mailings.id = ?', mailing_id)
于 2017-01-14T13:24:44.563 回答
1

paranoidgem 设置了一个默认范围,即只在查询中包含未删除的项目。解决方法是:

Field.joins(:mailings).where('mailings.id = ? AND mailings.deleted_at IS NOT NULL', mailing_id)
于 2016-08-14T21:53:49.627 回答
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

让我知道我是否能够提供帮助。

于 2016-08-14T22:04:03.383 回答
0

我参加聚会可能有点太晚了,但如果有人偶然发现这个问题,这会有所帮助。

您可以在父子节点之间创建附加关联,以包括已删除的记录。

在所问问题的背景下,

class Field < ActiveRecord::Base
  has_many :mailing_fields, dependent: :destroy
  has_many :mailing_fields_with_deleted, -> { with_deleted }
 
  has_many :mailings, through: :mailing_fields
  has_many :mailings_with_deleted, through: :mailing_fields_with_deleted
end

然后使用这个关系: Field.joins(:mailings_with_deleted).where('mailings.id = ?', mailing_id)

于 2020-08-07T14:15:34.117 回答
-1

Paranoid gem 具有访问已删除项目的内置范围:with_deleted。

Mailing.with_deleted.joins(:fields).where(id: mailing_id)
于 2016-08-15T01:58:32.900 回答