where to put (and how to require) sub-classes

I have a ThermalAnalysis class which is NOT a subclass of
ActiveRecord::Base. ThermalAnalysis has a dozen or so sub-classes. I
want to know the best places to put the files, and how to automatically
require all the subclass files.

Currently, I have:

app/models/
  thermal_analysis.rb

app/models/thermal_analyses/
  subclass1.rb
  subclass2.rb
  ...

First, is it stylistically okay to put thermal_analysis.rb in the models
directory, considering that it's not an ActiveRecord model? (It IS
intimately tied to a few AR models.) If not in models, then where would
you suggest?

Second, what's the best technique for requiring all the ThermalAnalysis
subclasses? I could push a new value onto $LOAD_PATH from within
thermal_analysis.rb, as in:

  $LOAD_PATH << File.expand_path("../thermal_analyses", __FILE__)

...but that will only get triggered when ThermalAnalysis is first
referenced, which is usually too late. (FWIW, ThermalAnalysis is
essentially an abstract class: only its subclasses get instantiated.)

TIA.

- ff

subclass2.rb

...

First, is it stylistically okay to put thermal_analysis.rb in the models
directory, considering that it's not an ActiveRecord model? (It IS
intimately tied to a few AR models.) If not in models, then where would
you suggest?

/models is definitely not restricted to ActiveRecord subclasses, for
example I'd 100% put mongodb models in there. You might be able to
reasonably claim that this class does model data, the data itself is
just a layer of abstraction away. If not, then lib is where I'd put
things.

Second, what's the best technique for requiring all the ThermalAnalysis
subclasses? I could push a new value onto $LOAD_PATH from within
thermal_analysis.rb, as in:

$LOAD_PATH << File.expand_path("../thermal_analyses", __FILE__)

...but that will only get triggered when ThermalAnalysis is first
referenced, which is usually too late. (FWIW, ThermalAnalysis is
essentially an abstract class: only its subclasses get instantiated.)

Rails maps sub directories to namespaces - it will automatically look
for ThermalAnalysis::Foo in thermal_analysis/foo.rb. If you do add
something to the load path (you probably want to add it to active
support's load path so that auto require, preloading etc. work) you
could do it from an initializer ( a file in config/initializers)

Fred

Frederick Cheung wrote in post #972354:

/models is definitely not restricted to ActiveRecord subclasses...
...
Rails maps sub directories to namespaces - it will automatically look
for ThermalAnalysis::Foo in thermal_analysis/foo.rb.

Ah! Poifect! This works like a champ:

# file: app/modules/thermal_analysis/base.rb
module ThermalAnalysis
  class Base ... ; end
end

# file: app/modules/thermal_analysis/foo.rb
module ThermalAnalysis
  class Foo < ThermalAnalysis::Base ... ; end
end

... etc

Thanks for the explanation and solution.

- ff