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