gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:58:19 25 4
gpt4 key购买 nike

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

class Audit < ActiveRecord::Base
attr_accessible :activity
belongs_to :by, :polymorphic => true
belongs_to :on, :polymorphic => true
attr_accessible :by, :on
end

:by 和 :on 的多态关联用于存储任何类型的应该被审计的对象。主要是因为多态在模式中被分解为类型和 id,因此应该能够存储我所有的模型对象。
  create_table "audits", :force => true do |t|
t.string "activity"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.integer "on_id"
t.string "on_type"
t.integer "by_id"
t.string "by_type"
end

我遇到的问题来自所有被审计的对象也在使用偏执 gem 。偏执狂 gem 在每个模型表中引入了一个 deleted_at 列,该列通过其 default_scope 对该模型的每个查询进行检查,该范围设置为“where(deleted_at is null)”之类的内容。 paranoia gem 还提供了一个方法 .with_deleted ,它允许通过转动 default_scope 进行直接查询,结果还返回已被偏执/软删除的对象。

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

我不知道如何告诉 Rails 为每个添加 .with_deleted 调用的多态 :by 和 :on 对象运行查找查询。我的猜测是 rails 通过以下方式查找多态关系的对象
eval(type).find(id)

在我的情况下,这会给我应用了偏执狂 gem 的 default_scope 的对象。

我试图在审计中覆盖 self.find_by_sql 但没有运气。我陷入了一些 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”对象。

    关于ruby-on-rails-3 - 通过Rails 3中的多态关系获取偏执删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13555574/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com