我有两个需要相同功能的模型。我想学习如何使这种DRY成为正确的轨道......
对于这两种型号我都有:
before_save :assign_uuid
每种型号都有:
def assign_uuid
if self.uuid.nil?
self.uuid = ActiveSupport::SecureRandom.hex(32)
end
end
因为,assign_uuid生活在两个模型中,我应该把这个函数放在哪里?此外,在模型中,它说的是before_save。如何在其所在的位置调用assign_uuid?
由于
答案 0 :(得分:4)
我不是Ruby专家,所以我不确定这是不是不赞成,但如果我是你,我会把它放在 lib / 的文件中并打捞它直接在ActiveRecord :: Base上使用 class_eval。
ActiveRecord::Base.class_eval do
def assign_uuid
if self.uuid.nil?
self.uuid = ActiveSupport::SecureRandom.hex(32)
end
end
end
这样,它适用于所有型号。要么是这样,要么创建一个杂项模型助手文件,并将模块包含在您想要的模型中。
# lib/misc_model_helpers.rb
module MiscModelHelpers
def assign_uuid
if self.uuid.nil?
self.uuid = ActiveSupport::SecureRandom.hex(32)
end
end
end
# models/person.rb
class Person < ActiveRecord::Base
include MiscModelHelpers
before_save :assign_uuid
end
同样,我真的不是百分之百的最红宝石的做法。这可能是完全不同的东西。这只是两种适合我的方式!
答案 1 :(得分:1)
在lib
文件夹中,添加文件uuid_lib.rb
,然后编写
module UuidLib
def assign_uuid
if self.uuid.nil?
self.uuid = ActiveSupport::SecureRandom.hex(32)
end
end
end
并在模型内部写
include UuidLib
before_save :assign_uuid
可以找到更详细地解释模块和mixin的示例文章here。
答案 2 :(得分:-1)
你应该把它作为一个模块添加到模型中,然后将它混合到你的模型中,这就是你做你想做的事情的Ruby方法。