Assigning objects...

I'm a Ruby Newbie (hey that rhymes!) and I suspect I haven't understood the syntax properly.
I'm trying to assign one ActiveRecord object to the field of another and I think this should work:

>> org = Organisation.new
=> #<Organisation:0xb7652dd8 @new_record=true, @attributes={"fax_number"=>nil, "postal_address"=>nil, "name"=>nil, "org_structure_id"=>0, "location_address"=>nil, "tin"=>nil, "phone_number"=>nil, "contact"=>nil, "email_address"=>nil}>
>> org.name = "Aces High Inc."
=> "Aces High Inc."
>> person = NaturalPerson.new
=> #<NaturalPerson:0xb764997c @new_record=true, @attributes={"postal_address"=>nil, "fax_number"=>nil, "name"=>nil, "dob"=>nil, "phone_number"=>nil, "visa"=>nil, "mobile_number"=>nil, "email_address"=>nil, "nationality"=>nil}>
>> person.name = "Fred Flinstone"
=> "Fred Flinstone"
>> org.contact << person
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occured while evaluating nil.<<
        from (irb):13

My Organisation model looks like this:

class Organisation < ActiveRecord::Base
  belongs_to :org_structure
  belongs_to :natural_person, {:foreign_key => "contact"}
  has_many :natural_people, :through => :associates
  validates_associated :org_structure
end

So by my understanding that second "belongs_to" call is supposed to enable me to make the assignment that's failing. It's 1 o'clock in the morning, maybe this will make sense after a sleep...

Hi --

I'm a Ruby Newbie (hey that rhymes!)

That's usually called a "nuby" :slight_smile:

and I suspect I haven't understood the syntax properly.
I'm trying to assign one ActiveRecord object to the field of another and
I think this should work:

>> org = Organisation.new
>> org.name = "Aces High Inc."
>> person = NaturalPerson.new
>> person.name = "Fred Flinstone"
>> org.contact << person
NoMethodError: You have a nil object when you didn't expect it!

The << is only for collections, where you're adding one to many (like
library.books << some_book). Here there's only one of everything.

The method you call on the object, for an association, is always the
name of the association itself. You have no association called
"contact":

My Organisation model looks like this:

class Organisation < ActiveRecord::Base
belongs_to :org_structure
belongs_to :natural_person, {:foreign_key => "contact"}
has_many :natural_people, :through => :associates
validates_associated :org_structure
end

Either you need to set the value like this:

   org.natural_person = person

or, if you want to use org.contact, you need to change the
natural_person association to this:

   belongs_to :contact,
              :class_name => "NaturalPerson",
              :foreign_key => "contact_id"

and make any corresponding changes in natural_person.rb

David

Thank you Jason and David for your replies!

David said:

org = Organisation.new
org.name = "Aces High Inc."
person = NaturalPerson.new
person.name = "Fred Flinstone"
org.contact << person
        

NoMethodError: You have a nil object when you didn't expect it!
    
The << is only for collections, where you're adding one to many (like
library.books << some_book). Here there's only one of everything.
  
Brilliant! That's a bit of info that I didn't have.

The method you call on the object, for an association, is always the
name of the association itself. You have no association called
"contact":

My Organisation model looks like this:

class Organisation < ActiveRecord::Base
belongs_to :org_structure
belongs_to :natural_person, {:foreign_key => "contact"}
has_many :natural_people, :through => :associates
validates_associated :org_structure
end
    
OK, this sentence had to make me re-evaluate my understanding of what was going on!

I have defined a field "contact" in my table "organisations" and I was expecting this statement do set up the association:

    belongs_to :natural_person, :foreign_key => "contact"

In my mind I was saying "Right, it's going to derive the class name from the association, so it will correctly get the NaturalPerson class and I've stated that the foreign key is called 'contact' so I can access that class through the 'contact' member".

OK, so that is wrong!

if you want to use org.contact, you need to change the
natural_person association to this:

   belongs_to :contact,
              :class_name => "NaturalPerson",
              :foreign_key => "contact_id"

and make any corresponding changes in natural_person.rb
  
I do want to use org.contact, so I changed my model as per what you've put above:

    class Organisation < ActiveRecord::Base
      belongs_to :contact, {:class_name => "NaturalPerson", :foreign_key
    => "contact"}

The thing that hasn't clicked in my mind yet is that the association and foreign key have the same value - they are redundant (in my particular case). So I thought "Maybe the association name is the same as the field name by convention, but I could actually use any arbitrary name". So I tried this:

    class Organisation < ActiveRecord::Base
      belongs_to :foo, {:class_name => "NaturalPerson", :foreign_key =>
    "contact"}

So if my presumption is correct, I can update the "contact" field in the database by playing with the "foo" association in the ActiveRecord.

     >> org = Organisation.new
     >> org.name = "Wacky Widgets Pty Ltd"
     >> person = NaturalPerson.new
     >> person.name = "Barney Rubble"
     >> org.foo = person
     >> org.save
     >> puts org.foo.name
    Barney Rubble
     >> puts org.contact.name
    NoMethodError: undefined method `name' for 2:Fixnum
            from (irb):14

By George I think I've got it!

"Contact" is just a plain old integer, as I defined it in the ActiveRecord::Migration.

If I used "belongs_to" with the association name "contact" it will override the integer "contact" and add all the funkiness I'm looking for.

Thank you, thank you, thank you!