Class Loader Weirdness | Rails 3.0.3

Hi guys,

I am stuck on, what i think is a class loader issue.

In my app/models directory i have the following files:

reductions/base.rb
reductions/conversions_by_bucket.rb
reductions/conversions_by_hour.rb
reductions/impressions_by_hour.rb

(background – i am using mongoid, and i use these files to manage
mapReduce)

These classes only have class methods. In each of these classes I
added the following method:

def self.hello
“hello”
end

And checkout this weirdness from the rails console:

Reductions::ImpressionsByHour.hello
=> “hello”
Reductions::ConversionsByHour.hello
=> “hello”
Reductions::ImpressionsByBucket.hello

NoMethodError: undefined method `hello’ for
Reductions::ImpressionsByBucket:Class

BUT …

require ‘reductions/conversions_by_bucket.rb’
=> nil
Reductions::ConversionsByBucket.hello
=> “hello”

Soooooo weird!!! So why is reductions/conversions_by_bucket.rb not
being loaded by the class loader?!

I am using rails 3.0.3

Thanks!!

I have the feeling the class-names are bit mismatched. what is the
relation between Reductions::ConversionsByBucket and
Reductions::ImpressionsByBucket ?

  • Kristian

Yeah I thought that too – but i have looked it over hundreds of times
and can’t find the mismatch. I have simplifed the classes to just
have the hello method. And still have the same behavior. Here are
the three classes

#app/models/reductions/impressions_by_hour.rb
class Reductions::ImpressionsByHour
def self.hello
“hello”
end
end

#app/models/reductions/conversions_by_hour.rb
class Reductions::ConversionsByHour
def self.hello
“hello”
end
end

#app/models/reductions/conversions_by_bucket.rb
class Reductions::ConversionsByBucket
def self.hello
“hello”
end
end

ls app/models/reductions/
base.rb conversions_by_bucket.rb
conversions_by_hour.rb impressions_by_hour.rb unions.rb

The relationship between the classes is that they all perform map/
reduce methods. base.rb holds common code between them

I’m sure its something simple, but I am stumped!

– Jonathan

I should add, that the class kind-of gets loaded, Checkout the
following rails console sequence:

[2] > Reductions::ConversionsByBucket
=> Reductions::ConversionsByBucket
[3] > Reductions::ConversionsByBucket.class
=> Class
[4] > Reductions::ConversionsByBucket.hello
NoMethodError: undefined method `hello’ for
Reductions::ConversionsByBucket:Class

[5] > require ‘reductions/conversions_by_bucket.rb’
=> nil
[6] > Reductions::ConversionsByBucket.hello
=> “hello”

I created a test app that highlights the problem:

Ok figured it out.

The AWS/SW gem overwrites Module#const_missing – and messes with
things if you class ends in ‘Bucket’. Man, that was a great use of 6
hrs. No idea why it only happens when coupled with
InheritedResources, but that clearly is the root of the problem.