Ruby 1.9.3 - > 2.0 alias_method并扩展

lob*_*ati 6 ruby activerecord ruby-on-rails ruby-2.0

我正在尝试将Ruby 1.9.3应用程序升级到2.0,除了一次打嗝之外,一切似乎都很顺利.我写了一个模块,我在模型中包含了覆盖activerecord destroy的模块.它将现有destroy方法别名destroy!,然后覆盖destroy以更改deleted_at记录上的时间戳.只有当我升级到ruby 2.0时才会destroy!破坏记录,但行为就像我的新覆盖方法一样.知道为什么会这样吗?代码的相关部分如下.这里充分要点.

  def self.included(base)                                                          
    base.class_eval do                                                             
      alias_method :destroy!, :destroy                                             
      alias_method :delete!, :delete                                               
      default_scope -> { where(:deleted_at => nil) }                               
    end                                                                            

    base.send :extend, ClassMethods                                                
    base.send :include, InstanceMethods                                            
  end
Run Code Online (Sandbox Code Playgroud)

Nic*_*ban 0

如果为当前类中未直接定义的方法添加别名,则alias在执行该方法的类的最近祖先中查找该方法。

当您将其包含Trashable::InstanceMethods到某个模型中时,它会被插入到该模型的祖先链的前面。因此,调用destroy!该模型会触发destroy上的方法Trashable::InstanceMethods

如果您def destroyInstanceMethodsto移动base.class_eval,那么它将直接在包含模型中定义,并且包含“destroy”的该模型的最近祖先将是 ActiveRecord 中的相关模块。因此调用将按预期destroy!触发 SQL 。DELETE

请参阅class.ancestors进一步探讨此行为。