我正在使用 Paranoia gem,现在正在努力解决这个问题。我需要加入 has_many已删除的项目,但它只返回不删除。我的模型:
class Mailing < ActiveRecord::Base
acts_as_paranoid
has_many :mailing_fields
has_many :fields, through: :mailing_fields
end
class MailingField < ActiveRecord::
belongs_to :mailing
belongs_to :field
end
class Field < ActiveRecord::Base
has_many :mailing_fields, dependent: :destroy
has_many :mailings, through: :mailing_fields
end
Run Code Online (Sandbox Code Playgroud)
我正在运行的查询应该返回mailings已删除的项目:
Field.joins(:mailings).where('mailings.id = ?', mailing_id)
Run Code Online (Sandbox Code Playgroud) 我有一个 rails 应用程序,我在其中使用了 devise 和 paranoia gems。
我在 postgres db 中有一个用户表,它对电子邮件列进行了唯一验证。我正在使用偏执进行软删除,问题是当我删除用户然后使用已删除用户的电子邮件创建用户时会引发错误PG::UniqueViolation: ERROR。
我已经阅读过相关内容,并且知道可以使用 rails 的部分索引功能来解决这个问题。
http://scottsmerchek.com/2015/08/03/taking-the-d-out-of-crud/
https://devcenter.heroku.com/articles/postgresql-indexes#partial-indexes
我该如何实施?
抱歉格式不正确,从手机打字。
软删除记录后,我无法在show控制器上的操作上调用它,因为它会查找与记录匹配的记录ID WHERE deleted_at IS NULLL,考虑到宝石的用途,这是正确的,但我仍然希望能够在应用程序内以某种“只读”状态访问它,以便允许用户查看存档并可能恢复它。
如何解决删除范围以便我可以再次访问该对象?
更新1
根据@slowjack2k的建议,我可以使用以下查询访问软删除的记录:
@area = Area.only_deleted.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
后来由于CanCanCan 的原因 load_and_authorize_resource出现了一个新问题:它尝试调用
@area = Area.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
忽略only_deleted过滤器,导致错误,因为仅在deleted_at不为空(未删除)的情况下找到选定的id,并禁用授权“修复”它,所以它一定是CanCanCan和Paranoia之间的问题。
这是一个具有完全相同问题的线程:https ://github.com/rubysherpas/paranoia/issues/356
这是 StackOverflow 上的新问题线程:Paranoia 和 CanCanCan 之间的 Rails 5 兼容性受到损害?
如果找到解决方案,我会再次更新,谢谢。
更新2
问题已解决,解决方案可以在我上面提到的新问题线程中找到。