使用 Mixin 和 ActiveSupport::Concern 重构Model
假设 Order 与 Reciept 这两个 model 里面都有 generate_token 这个 method。

app/models/order.rb
class Order < ActiveRecord::Base
  def generate_token
    self.token = SecureRandom.uuid
  end
end
app/models/reciept.rb
class Reciept < ActiveRecord::Base
  def generate_token
    self.token = SecureRandom.uuid
  end
end

重构代码,新增一个档案,将此method变成一个[特性]

touch app/models/concerns/tokenable.rb
app/models/concerns/tokenable.rb
module Tokenable
  def generate_token
    self.token = SecureRandom.uuid
  end
end

修改 Order 和 Reciept 代码

app/models/order.rb
class Order < ActiveRecord::Base
  include Tokenable
end
app/models/reciept.rb
class Reciept < ActiveRecord::Base
  include Tokenable
end  

但是发现原代码中还有一行跟generate_token有关的代码

before_create :generate_token

这2行代码是一组的,但是一般纯的 Ruby module 其实不认识 before_create,所以Rails内部开发一套工具
ActiveSupport::Concerns解决这个问题,让module也支援 before_create

app/models/concerns/tokenable.rb
module Tokenable
  extend ActiveSupport::Concern
  
  included do 
    before_create :generate_token 
  end
    
  def generatetoken
    self.token = SecureRandom.uuid
  end  
end