has_and_belongs_to_many with one-way "many"

Hi-

My model is such that I have Users who "own" 1 or more Contacts. My
schema is like this (abriged):

<sql>

CREATE TABLE users (
id int primary key auto_increment,
first_namename varchar(40)
....more columns....
);

CREATE TABLE contacts(
id int primary key auto_increment,
...more columns...
);

CREATE TABLE user_contacts (
user_id int not null,
contact_id int null,
CONSTRAINT fk_uc_user FOREIGN KEY (user_id) REFERENCES user(id),
CONSTRAINT fk_uc_contact FOREIGN KEY (contact_id) REFERENCES
contacts(id),
);

</sql>

Now, a user a can have multiple contacts, but from the other direction
a single contact is "owned" by only 1 user. Yes, I could put a
"user_id" column in the Contacts table and not have the linking table
there at all, but this seems like bad design.

Currently, my model is:

class Contact < ActiveRecord::Base
  has_and_belongs_to_many :user, :join_table => "user_contacts"
end

and

class User < ActiveRecord::Base
  has_and_belongs_to_many :contact, :join_table => "user_contacts"
end

and this works. However, when back tracking via a contact, its an array
for "user":

c = Contact.find(4)

=> #<Contact:0xb7431200 @attributes={"created_on"=>"2006-09-12
22:08:24", "dob"=>"2006-09-12", "id"=>"4", "first_name"=>"Foo",
"last_name"=>"Bar"}>

c.user

=> [#<User:0xb794d164 @attributes={"created_on"=>"2006-09-11 23:58:28",
"contact_id"=>"4", "id"=>"1", "user_id"=>"1", "first_name"=>"Blah",
"password"=>"xxxx", "last_name"=>"Blubber",
"email"=>"user@domain.com"}>]

c.user[0].first_name

=> "Blah"

Notice the reference to the 0th array element. Now what I would like to
do is use my schema but have it enforce contact(many) to user(one)
relationships without loading an array of objects going from contact to
user. I think a "has_many :contact" in User is appropriate, but from
the Contact side I dont see which association works, "belong_to" doesnt
take any options that support going through a secondary join table.

What are my options?

Thanks in advance
/Cody

Revisit this assumption and you’ll be pleased with the results.
Contact belongs_to :user
User has_many :contacts

jeremy