通过相关的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
我有 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