Forum: Ruby on Rails Calling class methods from included module

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Rasmus N. (Guest)
on 2009-01-04 18:13
Hi,

I have these two ActiveRecord models: UserEvent and CoordinateEvent.

The models are extended with the module MapEvent. MapEvent includes some
class methods and some instance methods.

Now, I want both models to use ActiveRecord's serialize
(http://api.rubyonrails.org/classes/ActiveRecord/Ba...).

My MapEvent looks something like the following. I simply can't figure
where to put "serialize :column_name":

[code]
module MapEvent
  def self.included(base)
    base.extend(ClassMethods)
  end

  def a_method
  end

  module ClassMethods
    def another_method
    end
  end
end
[/code]

How do I call the serialize method from the above context?

An extra question:
Also, it suddenly hit me, that instead of a module I could write
MapEvent as a class that inherits from ActiveRecord instead of a module
- and then let UserEvent and CoordinateEvent inherit from MapEvent?
Would you recommend this? Generally speaking, when should you use
mixins/module and when you use inheritance?

Hope my questions are clear. Thanks in advance!
Rasmus N. (Guest)
on 2009-01-04 18:26
Well - I think I now can answer both of my questions myself. In case
anyone is curious here is what I've learned:

In order to call the serialize method that the two models inherited from
AR write this:
module MapEvent
  def self.included(base)
    base.serialize :command
  end
end

This makes sense as serialize is just an instance method of the models.

And regarding the module/inheritance question I found an answer reading
these article (including the comments):
http://bibwild.wordpress.com/2007/04/10/ruby-and-m...

Modules should generally speaking be used when you just want to add
methods to your concrete classes. If you want to add new class or
instance variables use "normal" inheritance.
This topic is locked and can not be replied to.