通过相关的activerecord对象获取删除的对象

Get deleted object with paranoid through related activerecord objects

我有 3 个模型:

class Request < ActiveRecord::Base
  acts_as_paranoid
  belongs_to :offer
end

class Offer < ActiveRecord::Base
  belongs_to :cruise, inverse_of: :offers
  has_many :requests
end

class Travel < ActiveRecord::Base
  acts_as_paranoid    
  has_many :offers, inverse_of: :travel
end

通常我可以像这样通过链访问 Travel 对象:request.offer.travel.

但是,如果我需要的 Travel 对象被 paranoia 删除 - 我无法通过此类对象链访问它。

Travel.with_deleted.find(some_id_of_deleted_travel) 完美地工作,但是 request.offers.travel.with_deleted,同一个对象,抛出我 undefined method 'with_deleted' for nil:NilClass

如何通过关系访问已删除的对象?

我找到了答案,但是,我对它不满意。

为了获取被软删除的关联对象,我必须像这样修改 Offer 模型并取消作用域关系:

class Offer < ActiveRecord::Base
  belongs_to :cruise, inverse_of: :offers
  has_many :requests

  def travel
    Travel.unscoped { super }
  end
end

在我的例子中,这可行,但破坏了一些功能,因为我只需要在这种情况下取​​消范围关系,而其他情况保持不变。如果有 request.offers.travel(:unscoped) 之类的东西就好了

在我的例子中,最好的解决方案是像 Travel.with_deleted.find(@offer.travel_id)

一样单独访问这个对象

On Rails > 4. 您可以使用 unscope 方法删除偏执范围。

class Request < ActiveRecord::Base
  acts_as_paranoid
  belongs_to :offer, -> { unscope(where: :deleted_at) }
end