Forum: Ruby on Rails Yet another "NameError: uninitialized constant" problem

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.
34e7aaf8e8589d196a2f1b9c4d1280a0?d=identicon&s=25 Gary Bisaga (fool4jesus)
on 2008-11-29 04:33
I've searched for information about this and compared what I have to the
solutions I can find, here and elsewhere. I found some good and useful
information, yet my stuff still doesn't work. I was hoping somebody here
could spot something. I'm using rails 2.1.2 and I'm pretty new to ruby
and rails.

My goal is a fairly simple many-to-many relationship linking "modules"
and "users". There's 3 tables (I know the names are inconsistent - it's
a little strange because it was an existing database that I dumped into
rails):
- module: a module definition
- users: the users of the system
- module_user_map: join table linking modules and users

My data model (from schema.rb) looks in part like this:
create_table "module", :force => true do |t|
    t.string   "name", :default => "", :null => false
    t.integer  "status", :default => 0,  :null => false
    ...
end

create_table "module_user_map", :force => true do |t|
    t.integer  "module",           :default => 0, :null => false
    t.integer  "user",             :default => 0, :null => false
    ...
end

create_table "users", :force => true do |t|
    t.string    "first_name",       :limit => 45
    t.string    "last_name",        :limit => 45
    t.string    "login",            :limit => 45
    ...
end

Here's the corresponding files in app/models directory. It appears that
I could not use "module" as the model name because that is a reserved
word in rails, so I had to prepend "project_" to the "module" names.
This might be where I messed up, I don't know.

=============== project_module.rb ===================
class ProjectModule < ActiveRecord::Base
  set_table_name "module"
  has_many :module_user_maps, :dependent => :delete_all
  has_many :users, :through => :module_user_maps
end

=============== user.rb ===================
class User < ActiveRecord::Base
  has_many :module_user_maps, :dependent => :delete_all
  has_many :project_modules, :through => :module_user_maps
end

=============== module_user_maps.rb ===================
class ModuleUserMaps < ActiveRecord::Base
  set_table_name "module_user_map"
  belongs_to :user
  belongs_to :project_module
end

So I run from the script/console (same thing happens in the server):

>> u=User.find(2)
=> #<User id: 2, first_name: "Site", last_name: "User", login: "user",
password:
 "password", organization: 2, roles: "public", last_modified:
"2008-11-17 12:09:
10", last_modified_by: nil, last_login: "2008-11-17 12:10:06", status:
1, date_c
reated: nil, address1: nil, address2: nil, city: nil, state: nil,
postal_code: n
il, email: nil>
>> u.project_modules
NameError: uninitialized constant User::ModuleUserMap
        from
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_suppo
rt/dependencies.rb:493:in `const_missing'
... etc ...
>> u.module_user_maps
NameError: uninitialized constant User::ModuleUserMap
        from
C:/Ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.2/lib/active_suppo
rt/dependencies.rb:493:in `const_missing'
        from
C:/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.2/lib/active_record
/base.rb:1914:in `compute_type'
... etc ...

I'm hoping somebody can spot something fairly simple. This should not be
a hard thing to do. Thanks!
2b891e820c238ded365d035771603f21?d=identicon&s=25 Bill Walton (Guest)
on 2008-11-29 05:10
(Received via mailing list)
Hi Gary,

Gary Bisaga wrote:

> =============== module_user_maps.rb ===================
> class ModuleUserMaps < ActiveRecord::Base
>   set_table_name "module_user_map"
>   belongs_to :user
>   belongs_to :project_module
> end
>
> So I run from the script/console (same thing happens in the server):
>
> NameError: uninitialized constant User::ModuleUserMap

I think if you change the class name to singular (and the file name)
you'll
be good to go.

Best regards,
Bill
34e7aaf8e8589d196a2f1b9c4d1280a0?d=identicon&s=25 Gary Bisaga (fool4jesus)
on 2008-11-29 05:26
Hallelujah! You are a lifesaver Bill - you got me almost all the way
home. At least, now it is giving me an error message that is actually
useful in figuring out what the problem is:

ActiveRecord::StatementInvalid: Mysql::Error: #42S22Unknown column
'module_user_
map.user_id' in 'where clause': SELECT `module`.* FROM `module`    INNER
JOIN mo
dule_user_map ON module.id = module_user_map.project_module_id    WHERE
((`modul
e_user_map`.user_id = 2))

So, after adding a few :foreign_key declarations like this:

class ModuleUserMap < ActiveRecord::Base
  set_table_name "module_user_map"
  belongs_to :user, :foreign_key => "user"
  belongs_to :project_module, :foreign_key => "module"
end

we're good. Thank you so much! It would be great if this gave better
error messages.

<>< gary

Bill Walton wrote:
> I think if you change the class name to singular (and the file name)
> you'll be good to go.
2b891e820c238ded365d035771603f21?d=identicon&s=25 Bill Walton (Guest)
on 2008-11-29 05:37
(Received via mailing list)
Hi Gary,

Gary Bisaga wrote:

> we're good. Thank you so much!

You're very welcome.  Glad to help.

Best regards,
Bill
This topic is locked and can not be replied to.