Uninitialized constant exception when trying to navigate a has_many => through relationship

Hey All,

I'm trying to do a many-to-many relationship w/has_many, :through and
having trouble.

I want to classify my Projects into one or more ResearchAreas. So I
have a Project model, a ResearchArea model, and a ProjectsResearchArea
model to link them. So--many-to-many between Projects & ResearchAreas.
I'm not sure where I went wrong, but when I try to traverse the hm=>t
relationship (from either Project or ResearchArea) I get "NameError:
uninitialized constant ResearchArea::Projects" (see below for details).
However, I can traverse the simple has_many relationship to my join
model (illustrated below).

Can anybody tell me what I've done wrong?

Thanks!

-Roy

Migration:

  create_table :research_areas, :force => true do |t|
    t.string :name, :null => false
    t.string :abbreviation
    t.timestamps
  end
  create_table :projects_research_areas, :force => true do |t|
    t.integer :project_id
    t.integer :research_area_id
  end

Models:

  class ProjectsResearchArea < ActiveRecord::Base
    belongs_to :projects
    belongs_to :research_areas
  end
  
  class ResearchArea < ActiveRecord::Base
    has_many :projects_research_areas, :dependent => :delete_all
    has_many :projects, :through => :projects_research_areas
  end
  
  class Project < ActiveRecord::Base
    has_many :projects_research_areas, :dependent => :delete_all
    has_many :research_areas, :through => :projects_research_areas
  end

Console session:

  C:\railsapps\collabtrac>ruby script\console
  Loading development environment (Rails 2.0.2)
  >> ra = ResearchArea.find(:first)
  => #<ResearchArea id: 20, name: "Behavior", abbreviation: nil,
created_at: "2008
  -05-13 12:50:50", updated_at: "2008-05-13 12:50:50">
  >> prj = Project.find(:first)
  => #<Project id: 2, name: "Adolescent Depression Screening",
abbreviation: "ASC"
  , description: "Tests a brief screening instrument for screening
ad...", grant_n
  umber: "3", status_id: 2, start_date: "2008-06-27", end_date:
"2008-04-29", fund
  er_id: 3, funding_mechanism: nil>
  >> ra.projects_research_areas.count
  => 0
  >> prj.projects_research_areas.count
  => 0
  >> ra.projects
  NameError: uninitialized constant ResearchArea::Projects
          from
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_suppo
  rt/dependencies.rb:478:in `const_missing'
          from
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record
  /base.rb:1750:in `compute_type'
          from
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record
  /reflection.rb:125:in `send'
          from
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record
  /reflection.rb:125:in `klass'
          from
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record
  /associations/has_many_through_association.rb:140:in `find_target'
          from
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record
  /associations/association_proxy.rb:133:in `load_target'
          from
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record
  /associations/association_proxy.rb:55:in `reload'
          from
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.0.2/lib/active_record
  /associations/association_proxy.rb:77:in `inspect'
          from c:/ruby/lib/ruby/1.8/irb.rb:298:in `output_value'
          from c:/ruby/lib/ruby/1.8/irb.rb:151:in `eval_input'
          from c:/ruby/lib/ruby/1.8/irb.rb:259:in `signal_status'
          from c:/ruby/lib/ruby/1.8/irb.rb:147:in `eval_input'
          from c:/ruby/lib/ruby/1.8/irb.rb:146:in `eval_input'
          from c:/ruby/lib/ruby/1.8/irb.rb:70:in `start'
          from c:/ruby/lib/ruby/1.8/irb.rb:69:in `catch'
          from c:/ruby/lib/ruby/1.8/irb.rb:69:in `start'
          from c:/ruby/bin/irb.bat:15>>
  ?>

Roy Pardee
Research Analyst/Programmer
Group Health Center For Health Studies (Cancer Research Network)
(206) 287-2078
Google Talk: rpardee

Ach--nevermind--figured this out on my ferry ride home. The problem is
my join model--I was using plural versions of the model names in
belongs_to, and they need to be singular. So changing to this:

  class ProjectsResearchArea < ActiveRecord::Base
    belongs_to :project
    belongs_to :research_area
  end

Fixed me up.

Sorry for any wasted brain cycles...

-Roy

[mailto:rubyonrails-talk@googlegroups.com] On Behalf Of Pardee, Roy

Ah, quite right--thanks!

Just had the same problem and was solved with one quick research. THANKS
TO THE GREAT COMMUNITY!

Roy Pardee wrote: