开发者

Make all Rails models inherit from certain class

I wrote an upsert method for one of my models. I would like all my models to have this upsert method. It seemed to me that the logical solution was to define a model that inherits from Act开发者_开发知识库iveRecord::Base and then have all my other models inherit from that. But if I do that, Rails complains that the new model I created doesn't have a table to go with it, which is true, but I don't care.

Since the way I tried is apparently not the right way to do it, what's the right way to do it?


You can extend ActiveRecord with a module. you only do it in one place and it will be accessible for all models that inherits from ActiveRecord.

module YourModule
  def self.included(recipient)
    recipient.extend(ModelClassMethods)
    recipient.class_eval do
      include ModelInstanceMethods
    end
  end # #included directives

  # Class Methods
  module ModelClassMethods
    # A method accessible on model classes
    def whatever

    end
  end

  # Instance Methods
  module ModelInstanceMethods
    #A method accessible on model instances
    def another_one

    end
  end
end

#This is where your module is being included into ActiveRecord
if Object.const_defined?("ActiveRecord")
  ActiveRecord::Base.send(:include, YourModule)
end


There are two ways to do this.

1) To have a parent model, but not need to create a table for it (i.e. an abstract class) you should set

class YourAbstractClass < ActiveRecord::Base
    self.abstract_class = true 

    # rest of class code
end

2) Put the method in a module, that you include from all your models that need it (as in @Mark's answer)


You can move that method to a module and include that module in all the models that require that method.

Like I have this Utils module in lib folder of my app module Utils ...

  def to_name(ref)
      ref.gsub('_', ' ').split.collect { |w| w.capitalize }.join(' ')
  end

  ...
end

Then in my model, I say

class MyModel < AR::Base
  include Utils
  ...
end

Probably, if you are using Rails 3, you should load the files in the lib folder by configuring your application.rb

config.autoload_paths += %W(#{config.root}/lib)
0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜