在Active Record中创建之前

时间:2014-07-29 23:59:19

标签: ruby-on-rails ruby activerecord

我想为所有模块设置一个before_create

我一直在尝试的是:

module ActiveRecord
  module UserMonitor
    require 'securerandom'

    before_create :attach_uuid
      def attach_uuid
      self.uuid = SecureRandom.uuid.gsub("-","")
    end
  end
end

这似乎不起作用。 如果我进入每个模块并将其添加到那里它有效,但我想在全球范围内进行。

关于如何以这种方式实现这一目标的任何想法或想法?我知道我可以在触发器中做到这一点,但我不想走那条路,我想避免碰到每个模块/类,以防我需要改变一些东西。

目前使用Ruby 1.9.3目前无法升级我的应用程序,直到我将来更改代码。

谢谢!

2 个答案:

答案 0 :(得分:2)

我使用的另一个解决方案是将UUID的逻辑放在你自己的模块中。我已经将一些(类)方法添加到我的AR中,比如set_default_if,所以这对我来说是一个好地方。

module MyRecordExt
    def self.included base
        base.extend ClassMethods   # in my case some other stuff 
        base.before_create :attach_uuid # now add the UUID 
    end

    def attach_uuid
        begin
            self.uuid = SecureRandom.uuid
        rescue
            # do the "why dont we have a UUID filed?" here
        end
    end


    # some other things not needed for add_uuid
    module ClassMethods
        include MySpecialBase # just an eg.   

        def default_for_if(...)
            ...
        end
    end
end         

然后

class Articel < ActiveRecord::Base
    include MyRecordExt
    ...
end 

一般来说,我避免为修改AR基础的所有模型做一些事情 - 我在向所有人添加UUID时遇到了第一次糟糕的体验,并且与设计GEM模型崩溃了......

答案 1 :(得分:1)

如果您在ActiveRecord模块中定义attach_uuid,那么您不能只调用每个控制器顶部的before_create :attach_uuid吗?这是DRY。

是否有可以将其添加到UserMonitor控制器?

class UserMonitor < ActiveRecord::Base
  before_create :attach_uuid
end