Question

I have a model named User and I want to be able to self reference other users as a Contact. In more detail, I want a uni-directional relationship from users to other users, and I want to be able to reference an owned user of one user as a 'contact'. ALSO, i want to have information associated with the relationship, so I will be adding fields to the usercontact relation (I just edited this sentence in).

I attempted to do this while using the answer to this question as a guide.

Here is the User model:

user.rb

class User < ActiveRecord::Base
  attr_accessible(:company, :email, :first_name, :last_name,
      :phone_number, :position)

  has_many(:user_contacts, :foreign_key => :user_id,
      :dependent => :destroy)
  has_many(:reverse_user_contacts, :class_name => :UserContact,
      :foreign_key => :contact_id, :dependent => :destroy)
  has_many :contacts, :through => :user_contacts, :source => :contact

end

I also created the model UserContact as a part of connecting contacts to users:

usercontact.rb

class UserContact < ActiveRecord::Base
  belongs_to :user, :class_name => :User
  belongs_to :contact, :class_name => :User
end

Here is the create_users.rb migration file i used:

create_users.rb

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :first_name
      t.string :last_name
      t.string :phone_number
      t.string :email
      t.string :company
      t.string :position

      t.timestamps
    end
  end
end

And here is the create_users_contacts.rb migration:

create_users_contacts.rb

class CreateUsersContacts < ActiveRecord::Migration
  def up
    create_table :users_contacts, :force => true do |t|
      t.integer :user_id, :null => false
      t.integer :contact_id, :null => false
      t.boolean :update, :null => false, :default => false
    end

    # Ensure that each user can only have a unique contact once
    add_index :users_contacts, [:user_id, :contact_id], :unique => true
  end

  def down
    remove_index :users_contacts, :column => [:user_id, :contact_id]
    drop_table :users_contacts
  end
end

However, for reasons unknown to me, I believe something has gone awry in the linking since on my users index page, I have a column using <td><%= user.contacts.count %></td>, but I get this error from the line when I attempt to load the page:

uninitialized constant User::UserContact

I think the issue may be something to do with the fact that I want to name users associated with another user as contacts, because I cannot find other examples where that is done, and as far as I can tell I am doing everything properly otherwise (similarly to other examples).

The closest similar problem that I found was outlined and solved in this question. The issue was incorrect naming of his connecting model, however I double checked my naming and it does not have that asker's problem.

Any help is appreciated, let me know if any other files or information is necessary to diagnose why this is occurring.

EDIT

After changing usercontact.rb to user_contact.rb, I am now getting this error:

PG::Error: ERROR:  relation "user_contacts" does not exist
LINE 1: SELECT COUNT(*) FROM "users" INNER JOIN "user_contacts" ON "...
                                                ^
: SELECT COUNT(*) FROM "users" INNER JOIN "user_contacts" ON "users"."id" = "user_contacts"."contact_id" WHERE "user_contacts"."user_id" = 1

EDIT TWO

The issue was that my linking table, users_contacts, was misnamed, and should have been user_contacts! so I fixed it, and now it appears to work!!

Était-ce utile?

La solution

You need to rename your usercontact.rb to user_contact.rb

This is naming convention rails autoload works with.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top