我想为所有模块设置一个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目前无法升级我的应用程序,直到我将来更改代码。
谢谢!
答案 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