Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 通过Rails 3中的多态关系获取偏执狂删除的对象_Ruby On Rails 3_Polymorphic Associations_Soft Delete - Fatal编程技术网

Ruby on rails 3 通过Rails 3中的多态关系获取偏执狂删除的对象

Ruby on rails 3 通过Rails 3中的多态关系获取偏执狂删除的对象,ruby-on-rails-3,polymorphic-associations,soft-delete,Ruby On Rails 3,Polymorphic Associations,Soft Delete,我有一个Audit类,用于存储操作、by和on属性 class Audit < ActiveRecord::Base attr_accessible :activity belongs_to :by, :polymorphic => true belongs_to :on, :polymorphic => true attr_accessible :by, :on end 我遇到的问题来自于所有被审计的对象都在使用paranoia gem。paranoia g

我有一个Audit类,用于存储操作、by和on属性

class Audit < ActiveRecord::Base
  attr_accessible :activity
  belongs_to :by, :polymorphic => true
  belongs_to :on, :polymorphic => true
  attr_accessible :by, :on
end
我遇到的问题来自于所有被审计的对象都在使用paranoia gem。paranoia gem在每个models表中引入了一个deleted_at列,该列通过其默认_作用域(设置为“where(deleted_at为null)”)对该模型上的每个查询进行检查。paranoia gem还提供了一种方法。with_deleted允许通过打开默认_作用域进行直接查询,因此还返回已被paranoid/soft deleted的对象

但是,如果我有任何已删除的项目,并且我尝试使用列出所有已审核的项目

Audit.all
我不知道如何告诉Rails为添加.with_deleted调用的每个多态:by and:on对象运行查找查询。我的猜测是rails通过

eval(type).find(id)
在我的例子中,它会给我一个对象,这个对象应用了paranoia gem的默认范围

我试图在审计中通过sql重写self.find\u,但没有成功。我陷入了一些Arel方法中,在我继续之前,我需要更多地阅读这些方法

我看到了以下解决方案,但我不知道如何实现它们

  • 覆盖多态查找。怎么做
  • 在对原始SQL进行求值之前,将其作为字符串获取,并sub/gsub Where deleted_at is null部分
  • 如果您对如何实现这一目标提出任何建议,我们将不胜感激。

    请尝试以下方法:

    def on!
      if on_type && on_id
        on_type.constantize.with_deleted.find(on_id)
      end
    end
    
    如果记录已被真正删除,这将引发ActiveRecord::RecordNotFound错误,否则即使标记为已删除,也将返回“on”对象

    def on!
      if on_type && on_id
        on_type.constantize.with_deleted.find(on_id)
      end
    end