Forum: Ruby on Rails Only one "initialize" method allowed on AR objects?

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.
Wes G. (Guest)
on 2007-01-04 23:42
I'm having some trouble with some seemingly basic OO stuff with one of
my AR::Base descendants.

I ended up creating a custom initialize method that takes two parameters
- an integer and the standard AR attributes hash, like so:

  def initialize(user_id, attributes = nil)

In another part of my application, I was calling "clone" on one of these
objects and it gave me an incorrect number of arguments error.  I
figured out it was because of the fact that my initialize expects 1
argument no matter what.

As soon as I provided a default value for user_id in the argument list
above, the call to clone was fine - I assume since now my initialization
didn't require any arguments at all.

But this is somewhat disturbing.  I was under the impression that I
would still have access to the regular initialize(attributes = nil)
method that I get from ActiveRecord::Base.  Why is it not available?

Doesn't this imply that I can't have multiple constructors for an AR
object?

I tried to add

def initialize(attributes = nil)
  super
end

to my object and I still can't instantiate it just running "new" (no
arguments).

What gives?

Thanks for any help.

Wes
Mick S. (Guest)
on 2007-01-05 00:14
Use the :after_initialize callback (or one of the other AR callbacks)
rather than trying to override the initialize method. This is the
recommended Rails approach.
Wes G. (Guest)
on 2007-01-05 02:06
Thanks Mick.

I'm aware of the after_initialize method, but I just keep forgetting
that ActiveRecord objects don't behave like normal objects.

"Least surprise" my a** :).  Strictly speaking, I suppose, Ruby is
"least surprise", Rails is "opinionated." :)  But don't get me wrong, I
really dig ActiveRecord.

Still, it's weird to me that the existence of a method (initialize in
this case) seem to preclude any polymorphism on that method.

Wes
Alex W. (Guest)
on 2007-01-05 08:28
Mick S. wrote:
> Use the :after_initialize callback (or one of the other AR callbacks)
> rather than trying to override the initialize method. This is the
> recommended Rails approach.

You can also use super

  def initialize(foo, *args)
    @foo = foo
    super(*args)
  end

The super method calls the same method as defined in the parent class.
This let's you override a method, and still call the original method.
Wes G. (Guest)
on 2007-01-05 08:43
Alex W. wrote:
> You can also use super
>
>   def initialize(foo, *args)
>     @foo = foo
>     super(*args)
>   end
>

This is what I was doing.  If you do this and then attempt to call clone
on your AR::Base descendant, it will complain.

Wes
Jason N. (Guest)
on 2007-01-06 20:30
(Received via mailing list)
Just a quick glance as I'm out the door, but don't you mean this to be a
class method IE self.initialize?
Jason
Wes G. (Guest)
on 2007-01-15 21:45
I now know that there is no method overloading within the context of one
class due to the dynamic nature of Ruby.  So I get it.

Wes
This topic is locked and can not be replied to.