Получить удаленный объект с помощью параноика через связанные объекты activerecord

У меня есть 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 ответа

Решение

Я нашел ответ, однако я не удовлетворен этим.

Для того чтобы получить связанный объект, который был мягко удален, я должен изменить 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)

На Rails > 4. Вы можете использовать метод unscope для удаления параноидального контекста.

class Request < ActiveRecord::Base
  acts_as_paranoid
  belongs_to :offer, -> { unscope(where: :deleted_at) }
end
Другие вопросы по тегам