开发者

Creating a Function that works for 2 models in Rails

I have two models which need an identical function. I'd like to learn how to make this D开发者_高级运维RY the right rails way...

For both models I have:

before_save :assign_uuid

Which in each model has:

  def assign_uuid
    if self.uuid.nil?
      self.uuid = ActiveSupport::SecureRandom.hex(32)
    end
  end

Since, assign_uuid lives in both models, Where is the one place I should place this func? Also, in the models, where it say's before_save. How do I call the assign_uuid in the location it is located?

Thanks


I'm no Ruby expert, so I'm not sure if this is frowned upon or not, but if I were you, I'd chuck it in a file in lib/ and whack it straight on ActiveRecord::Base with class_eval.

ActiveRecord::Base.class_eval do
  def assign_uuid
    if self.uuid.nil?
      self.uuid = ActiveSupport::SecureRandom.hex(32)
    end
  end 
end

That way, it's available for all your models. Either that, or create a miscellaneous model helpers file and include the module into the models you'd like.

# 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

Again, I'm really not 100% on the most rubyish way of doing this. It's probably something completely different. These are just two ways that work for me!


In your lib folder, add a file uuid_lib.rb, and write

module UuidLib

  def assign_uuid
    if self.uuid.nil?
      self.uuid = ActiveSupport::SecureRandom.hex(32)
    end
  end
end

and inside your model write

include UuidLib

before_save :assign_uuid

An example article explaining modules and mixins in more detail can be found here.


You should add this as a module and mix it into your models, that is the Ruby way to do what you are after.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜