gpt4 book ai didi

ruby-on-rails - ActiveRecord 回调列表

转载 作者:行者123 更新时间:2023-12-03 08:18:19 25 4
gpt4 key购买 nike

我已经浏览了 Rails 源有一段时间了,我认为没有更好的方法来获取所有回调列表,除了:ActiveRecord::Callbacks::CALLBACKS – 这是一个常量列表。

这意味着如果您使用像 devise_invitable 这样的 gem,它添加了一个名为 :invitation_accepted 的新回调。与分数 :after:before然后 ActiveRecord::Callbacks::CALLBACKS不管用。

除了打开 rails 模块并确保每个模型类都有一个内部回调列表之外,您是否知道一个简单的修复方法?

最佳答案

我将提出最通用的解决方案。

即使 gem 声明自定义回调,它也可以工作,例如paranoiaafter_real_destroy
列出所有回调

Model.methods.select { |m| m.to_s.include? "callback" }.sort

然后,如果您键入方法名称,例如,您可以获得给定的回调。
Model._update_callbacks
Model._real_destroy_callbacks
Model._destroy_callbacks

如果列出所有回调,则可以通过检查 @filter 找到所需的回调实例变量,例如
require 'pp'
Activity._destroy_callbacks.each_with_index { |clbk,index| puts "#{index}-------\n#{clbk.pretty_inspect}" } ; nil

# [...]

#<ActiveSupport::Callbacks::Callback:0x00007ff14ee7a968
@chain_config=
{:scope=>[:kind, :name],
:terminator=>
#<Proc:0x00007ff13fb825f8@/Users/mypc/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activemodel-4.1.16/lib/active_model/callbacks.rb:103 (lambda)>,
:skip_after_callbacks_if_terminated=>true},
@filter=
#<Proc:0x00007ff14ee7ac10@/Users/mypc/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activerecord-4.1.16/lib/active_record/associations/builder/association.rb:135 (lambda)>,
@if=[],
@key=70337193825800,
@kind=:before,
@name=:destroy,
@unless=[]>
4-------
#<ActiveSupport::Callbacks::Callback:0x00007ff14ee3a228
@chain_config=
{:scope=>[:kind, :name],
:terminator=>
#<Proc:0x00007ff13fb825f8@/Users/mypc/.rbenv/versions/2.3.7/lib/ruby/gems/2.3.0/gems/activemodel-4.1.16/lib/active_model/callbacks.rb:103 (lambda)>,
:skip_after_callbacks_if_terminated=>true},
@filter=:audit_destroy,
@if=[],
@key=:audit_destroy,
@kind=:before,
@name=:destroy,
@unless=[]>
5-------

关于ruby-on-rails - ActiveRecord 回调列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529867/

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