创建一个适用于Rails中2个模型的函数

时间:2010-11-29 20:41:56

标签: ruby-on-rails ruby-on-rails-3

我有两个需要相同功能的模型。我想学习如何使这种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?

由于

3 个答案:

答案 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方法。