This doesn't look like a rails issue.  It looks like ruby expected
behaviour, unless I misunderstand.

The constant ModuleSpecificModel doesn't exist.  Only
SomeModule::ModuleSpecificModel exists.  Ruby auto loading or rails
autoloading would not expect this code to 'install' the
ModuleSpecificModule at the top level ( I.e ::ModuleSpecificModel )

Sent from my iPad

On 13 Sep 2012, at 18:04, Gary Weaver <[email protected]> wrote:

I'm sure this is some basic misunderstanding I have to how dependency
resolution should work in Rails, but am experiencing some wierdness with
modules and models.

I hadn't been using modules for models much because I had run into early
issues with them, but woke up early this morning with the idea of a way to
use them for something that we need.

This was in a brand new Rails 4.0 beta project (using github rails/rails
master), but have the same behavior in Rails 3.2.6.

Here are the models. I just wanted to try to have the class load so I could
see which class was being loaded, but just referencing these model classes
causes issues:

app/models/associated_model.rb

class AssociatedModel < ActiveRecord::Base
  puts "in #{self.name}, AssociatedModel is #{AssociatedModel.name}"
  puts "in #{self.name}, ModuleSpecificModel is #{ModuleSpecificModel.name}"
  puts "in #{self.name}, MyModel is #{MyModel.name}"
  puts "in #{self.name}, RootOnlyModel is #{RootOnlyModel.name}"
end

app/models/my_model.rb

class MyModel < ActiveRecord::Base
  puts "in #{self.name}, AssociatedModel is #{AssociatedModel.name}"
  puts "in #{self.name}, ModuleSpecificModel is #{ModuleSpecificModel.name}"
  puts "in #{self.name}, MyModel is #{MyModel.name}"
  puts "in #{self.name}, RootOnlyModel is #{RootOnlyModel.name}"
end

app/models/root_only_model.rb

class RootOnlyModel < ActiveRecord::Base
  puts "in #{self.name}, AssociatedModel is #{AssociatedModel.name}"
  puts "in #{self.name}, ModuleSpecificModel is #{ModuleSpecificModel.name}"
  puts "in #{self.name}, MyModel is #{MyModel.name}"
  puts "in #{self.name}, RootOnlyModel is #{RootOnlyModel.name}"
end

app/models/some_module/associated_model.rb

class SomeModule::AssociatedModel < ActiveRecord::Base
  puts "in #{self.name}, AssociatedModel is #{AssociatedModel.name}" #bug
  puts "in #{self.name}, ModuleSpecificModel is #{ModuleSpecificModel.name}"
  puts "in #{self.name}, MyModel is #{MyModel.name}"
  puts "in #{self.name}, RootOnlyModel is #{RootOnlyModel.name}"
end

app/models/some_module/module_specific_model.rb

module SomeModule
  class ModuleSpecificModel < ActiveRecord::Base
    puts "in #{self.name}, AssociatedModel is #{AssociatedModel.name}"
    puts "in #{self.name}, ModuleSpecificModel is
#{ModuleSpecificModel.name}"
    puts "in #{self.name}, MyModel is #{MyModel.name}"
    puts "in #{self.name}, RootOnlyModel is #{RootOnlyModel.name}"
  end
end

app/models/some_module/my_model.rb

class SomeModule::MyModel < ActiveRecord::Base
  puts "in #{self.name}, AssociatedModel is #{AssociatedModel.name}"
  puts "in #{self.name}, ModuleSpecificModel is #{ModuleSpecificModel.name}"
  puts "in #{self.name}, MyModel is #{MyModel.name}"
  puts "in #{self.name}, RootOnlyModel is #{RootOnlyModel.name}"
end

And here is what happens in rails console:

$ rails c
Loading development environment (Rails 4.0.0.beta)
1.9.3p194 :001 > AssociatedModel
in AssociatedModel, AssociatedModel is AssociatedModel
NameError: uninitialized constant AssociatedModel::ModuleSpecificModel
  from /path/to/new_rails_app/app/models/associated_model.rb:3:in
`<class:AssociatedModel>'
  from /path/to/new_rails_app/app/models/associated_model.rb:1:in `<top
(required)>'
  from (irb):1
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:78:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:9:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands.rb:47:in `<top
(required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'
1.9.3p194 :002 > MyModel
in AssociatedModel, AssociatedModel is AssociatedModel
NameError: uninitialized constant AssociatedModel::ModuleSpecificModel
  from /path/to/new_rails_app/app/models/associated_model.rb:3:in
`<class:AssociatedModel>'
  from /path/to/new_rails_app/app/models/associated_model.rb:1:in `<top
(required)>'
  from /path/to/new_rails_app/app/models/my_model.rb:2:in `<class:MyModel>'
  from /path/to/new_rails_app/app/models/my_model.rb:1:in `<top (required)>'
  from (irb):2
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:78:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:9:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands.rb:47:in `<top
(required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'
1.9.3p194 :003 > RootOnlyModel
in AssociatedModel, AssociatedModel is AssociatedModel
NameError: uninitialized constant AssociatedModel::ModuleSpecificModel
  from /path/to/new_rails_app/app/models/associated_model.rb:3:in
`<class:AssociatedModel>'
  from /path/to/new_rails_app/app/models/associated_model.rb:1:in `<top
(required)>'
  from /path/to/new_rails_app/app/models/root_only_model.rb:2:in
`<class:RootOnlyModel>'
  from /path/to/new_rails_app/app/models/root_only_model.rb:1:in `<top
(required)>'
  from (irb):3
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:78:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:9:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands.rb:47:in `<top
(required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'
1.9.3p194 :004 > SomeModule::AssociatedModel
NameError: uninitialized constant
SomeModule::AssociatedModel::AssociatedModel
  from
/path/to/new_rails_app/app/models/some_module/associated_model.rb:2:in
`<class:AssociatedModel>'
  from
/path/to/new_rails_app/app/models/some_module/associated_model.rb:1:in
`<top (required)>'
  from (irb):4
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:78:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:9:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands.rb:47:in `<top
(required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'
1.9.3p194 :005 > SomeModule::ModuleSpecificModel
NameError: uninitialized constant
SomeModule::AssociatedModel::AssociatedModel
  from
/path/to/new_rails_app/app/models/some_module/associated_model.rb:2:in
`<class:AssociatedModel>'
  from
/path/to/new_rails_app/app/models/some_module/associated_model.rb:1:in
`<top (required)>'
  from
/path/to/new_rails_app/app/models/some_module/module_specific_model.rb:3:in
`<class:ModuleSpecificModel>'
  from
/path/to/new_rails_app/app/models/some_module/module_specific_model.rb:2:in
`<module:SomeModule>'
  from
/path/to/new_rails_app/app/models/some_module/module_specific_model.rb:1:in
`<top (required)>'
  from (irb):5
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:78:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:9:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands.rb:47:in `<top
(required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'
1.9.3p194 :006 > SomeModule::MyModel
NameError: uninitialized constant
SomeModule::AssociatedModel::AssociatedModel
  from
/path/to/new_rails_app/app/models/some_module/associated_model.rb:2:in
`<class:AssociatedModel>'
  from
/path/to/new_rails_app/app/models/some_module/associated_model.rb:1:in
`<top (required)>'
  from /path/to/new_rails_app/app/models/some_module/my_model.rb:2:in
`<class:MyModel>'
  from /path/to/new_rails_app/app/models/some_module/my_model.rb:1:in `<top
(required)>'
  from (irb):6
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:78:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands/console.rb:9:in
`start'
  from /path/to/github/rails/railties/lib/rails/commands.rb:47:in `<top
(required)>'
  from script/rails:6:in `require'
  from script/rails:6:in `<main>'

Thanks in advance,
Gary

-- 
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Core" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/rubyonrails-core/-/erh_BfrAOvgJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-core?hl=en.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en.

Reply via email to