RoR使用unextroy_all扩展ActiveRecord :: relation

时间:2013-07-30 12:19:04

标签: ruby-on-rails ruby activerecord

我基本上想要以下函数,但反之,我已经将undestroy函数用于单个类。

https://github.com/rails/rails/blob/2ad168ee41d590bd9a4d15eddf3c2f719c23b60a/activerecord/lib/active_record/relation.rb#L364

但是,我试图扩展ActiveRecord :: Relation无济于事。以下是我为ActiveRecord::Base

执行其他方法的方法

ActiveRecord::Base.extend Track::BaseTrack

但使用ActiveRecord::Relation.extend Track::TrackRelation似乎没有做任何事情。模块TrackRelation(在Track内)是:

  module TrackRelation

      def undestroy_all(conditions = nil)
        if conditions
          where(conditions).undestroy_all
        else
          to_a.each {|object| object.undestroy }.tap { reset }
        end
      end

  end

我是否使用正确的ActiveRecord类进行关系?

错误是:

undefined method "undestroy_all" for #<ActiveRecord::Relation []>

1 个答案:

答案 0 :(得分:8)

当您致电ActiveRecord::Relation.extend Track::TrackRelation时,您正在将Track::TrackRelation方法混合到ActiveRecord::Relation作为类方法。

您要做的是混合使用与实例方法相同的方法。您可以使用include而不是extend来执行此操作。但是Module#include是私有的。因此,实现目标的一种方法是:

ActiveRecord::Relation.send(:include, Track::TrackRelation)