1

我有 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

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

4

2 回答 2

1

我找到了答案,但我并不满意。

它为了获取被软删除的关联对象,我必须Offer像这样修改模型和 unscope 关系:

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)

于 2015-09-06T13:53:18.380 回答
1

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

class Request < ActiveRecord::Base
  acts_as_paranoid
  belongs_to :offer, -> { unscope(where: :deleted_at) }
end
于 2017-03-13T22:45:03.700 回答