transient subclass of an ActiveRecord subclass

hey all

I posted this same topic yesterday and it never showed up on the group?
I've heard reports of other peoples messages not showing up too...
very annoying!

Anyway, I'd like to be able to have transient (no persistent data of
their own) subclasses of my ActiveRecord classes but that seems to be
problematic.

Basically I'd like to be able to do this...

class Film < ActiveRecord::Base
...
...
end

class SomeTransient < Film
...
...
end

class SomeOtherTransient < Film
...
...
end

etc...

Then do this:

film = SomeTransient.find_by_title("some film title")

This just struck me actually... are ruby class methods not inheritable?

Clearly I could do all my stuff directly in the Film class but that
would get messy since the film instances are going to be taking on many
different personalities (lots of different derived attributes for
each).

I'm not sure why this seems to be so difficult?

Thanks in advance!
Tim

<snip>

Basically I'd like to be able to do this...

class Film < ActiveRecord::Base
...
end

class SomeTransient < Film
...
end

class SomeOtherTransient < Film
...
end

etc...

Then do this:

film = SomeTransient.find_by_title("some film title")

This just struck me actually... are ruby class methods not inheritable?

Clearly I could do all my stuff directly in the Film class but that
would get messy since the film instances are going to be taking on many
different personalities (lots of different derived attributes for
each).

I think you may be mixing up the semantics of inheritance here.
Inheritance is a "is a kind of" relationship. Unfortunately, you
haven't posted enough code to work out what exactly you are trying to
do, but I suspect it might be a case for delegation (which is a "uses"
relationship).

With inheritance, you are asserting that an instance of an inherited
class "is a" SomeTransient, and is also a Film. Now, if I understand
correctly, you want a Film to *behave* as a SomeTransient or
SomeOtherTransient, depending on what it is being used for in your
business logic.

Try:

class Film
  attr_accessor :name
end

require 'delegate'
class SomeTransient < SimpleDelegator
  def name_reverse
    self.name.reverse
  end
end

You can now do:

f = Film.new
f.name="Hello"

s = SomeTransient.new(f)
s.name_reverse #=> "olleH"

Or in your case, s = SomeTransient.new( Film.find_by_title('some file title'))

The Delegate library takes care of delegating all methods that are not
explicitly defined in the Delegate class to the delegate Film.

Cheers,
Max

Thanks for the respones guys, sorry it took me so long to get back but
"self.abstract_class = true" is, I think, what I was looking for:-)

Best
Tim