通过相关的activerecord对象获取具有偏执的删除对象

时间:2015-09-06 13:19:11

标签: ruby-on-rails ruby activerecord rails-activerecord acts-as-paranoid

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

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

2 个答案:

答案 0 :(得分:1)

On Rails&gt;你可以使用unscope方法去除偏执范围。

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

答案 1 :(得分:0)

我找到了答案,然而,我对此并不满意。

为了获得被软删除的关联对象,我必须像这样修改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)