Paranoia Gem - 加入已删除的项目

时间:2016-08-14 20:23:59

标签: ruby-on-rails ruby ruby-paranoia

我使用偏执狂宝石,现在正在努力解决这个问题。我需要加入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)

5 个答案:

答案 0 :(得分:1)

paranoid gem设置的默认范围仅包括查询中未删除的项目。解决方法是:

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

答案 1 :(得分: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

如果我能够提供帮助,请告诉我。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分: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)