Получить удаленный объект с помощью параноика через связанные объекты 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