I''m using rails to build a web-accessible database that will store  
information about patients that come into our hospital with brain  
injuries. Here''s my problem:
I''m trying to call a belongs_to relationship between two models, one  
of which descends from another using single-table inheritance. The  
first model is Patient:
     class Patient < ActiveRecord::Base
         belongs_to :race, :class_name => "PropertyList"
         belongs_to :sex, :class_name => "PropertyList"
     end
The second is PropertyList - all of these class definitions are in  
the same file:
     class PropertyList < ActiveRecord::Base
         def description
             form_number.to_s + ": " + name
         end
     end
     class Race < PropertyList
         has_many :patients
     end
     class Sex < PropertyList
         has_many :patients
     end
When I attempt to list a patient record and do this:
     patient.race.name
I get "undefined method ''race'' for
#<Patient>"... I know that the
race_id and sex_id in the patients table (the foreign keys for this  
relationship) are not null. Also, when I fire up script/console and  
attempt:
     races = Race.find(:all)
I get "NameError: uninitialized constant Races". Strangely, doing
     races = PropertyList.find_all_by_type("Race")
it works just fine. It seems I don''t understand how relationships  
work, or there''s some STI weirdness that''s going on.
I''ve read the
API docs several times, searched the list archives and googled to no  
avail.
Any help that anyone could provide would be greatly appreciated.  
Thanks -
Holland Alday
Medical Scientist Training Program
University of Mississippi Medical Center
holland-0lHqbOJ5DwTR7s880joybQ@public.gmane.org
Clarification of my previous question:
Here''s my situation: I''ve got an AR class called PropertyList.
It has
classes derived from it that include Race and Sex (this is a database  
of patients), like this:
     class PropertyList < ActiveRecord::Base; end
     class Race < PropertyList; end
Typing PropertyList.find(:all) at script/console returns everything  
in the table, like it should. Typing Race.find(:all) gives:
     NameError: uninitialized constant Race
...almost as if the class had never been declared. I can''t figure out  
what''s going on. Any help that anyone could provide would be greatly  
appreciated.
- Holland
PS - the AR::Base API documentation on single-table inheritance  
(http://api.rubyonrails.com/classes/ActiveRecord/Base.html) gives an  
example where Firm is set up as a subclass of Company. Fetching this  
record from the db is done by calling Company.find, not Firm.find. I  
feel sure there is a reason for this, but I can''t tell if this is a  
limitation of AR or if I''m just clueless.
On 8/9/05, Holland <holland@bipedal.net> wrote:> NameError: uninitialized constant RaceI get the same error with single table inheritance model with rails 1.0 Isn''t there any planned fix ?
J?r?me L wrote:> On 8/9/05, Holland <holland@bipedal.net> wrote: > >> NameError: uninitialized constant Race > > I get the same error with single table inheritance model with rails 1.0 > Isn''t there any planned fix ?In the dim depths of my memory (must be going back, ooh, weeks), I seem to recall a similar problem that was fixed by making sure that the interpreter had seen the STI subclasses before anything else happened, because there''s a set of conditions that result in them not getting loaded automatically. I may be completely misremembering, but I *think* putting a require ''stifile'' for each STI subclass file at the end of boot.rb does the trick. Perhaps someone with a less sieve-like memory can pitch in and correct me here? -- Alex
Jérôme L
2006-Feb-09  09:42 UTC
[Rails] [partly RESOLVED] ''undefined method'' using belongs_to and STI
On 2/3/06, Alex Young <alex@blackkettle.org> wrote:> In the dim depths of my memory (must be going back, ooh, weeks), I seem > to recall a similar problem that was fixed by making sure that the > interpreter had seen the STI subclasses before anything else happened, > because there''s a set of conditions that result in them not getting > loaded automatically. I may be completely misremembering, but I *think* > putting a require ''stifile'' for each STI subclass file at the end of > boot.rb does the trick. > > Perhaps someone with a less sieve-like memory can pitch in and correct > me here?Putting `model :sti` in application.rb does also the trick (it would be a more elegant issue)