Single Table Mapping

This is pretty simple, but I must be missing the obvious. I’ve got a
table that’s similar to this:

USERS:

  • id int
  • username varchar(64)
  • password varchar(64)
  • role_id int

ROLES:

  • id int
  • description varchar(16)

I’ve had no troubles doing has_many relationships at all. But I want to
map the user.role directly to the role model automatically (which sounds
like it should be really simple). Right now if I look at the user’s
attributes the correct role_id is shown, but I get a no method error if
I try and access user.role.

Do I need to do anything to tell rails to create a role model for the
user?

You need to use has_one instead of has_many


– Tom M.

OK, well I got it to work by changing the table format and removing the
role_id from the USERS table and adding a user_id to the ROLES table
then adding a has_one :role to the user model.

But is there not a way for it to map by using the role_id in the USERS
table? Since its a one-to-one relationship I don’t see the point of
having a row in the ROLES table for each user when all I really need is
a single column in the USERS table.

The B. wrote:

This is pretty simple, but I must be missing the obvious. I’ve got a
table that’s similar to this:

USERS:

  • id int
  • username varchar(64)
  • password varchar(64)
  • role_id int

ROLES:

  • id int
  • description varchar(16)

I’ve had no troubles doing has_many relationships at all. But I want to
map the user.role directly to the role model automatically (which sounds
like it should be really simple). Right now if I look at the user’s
attributes the correct role_id is shown, but I get a no method error if
I try and access user.role.

Do I need to do anything to tell rails to create a role model for the
user?

Yeah that’s how I ended up fixing the problem, but has_one requires a
user_id field in the ROLES table. This means for each user in the
database there is a row in the ROLES table. Since this is one-to-one it
would be better (IMHO) to have a single ROLE_ID in the USERS table, and
only have one row per role in the ROLES table. This would mean just one
additional smallint column the the USERS table and the ROLES table would
be nice and small and wouldn’t grow (unless I added more roles).

Tom M. wrote:

You need to use has_one instead of has_many


– Tom M.

When you set up your associations, make the one that you want to have
the foreign key ‘belongs_to’ the one it is associated with.

In your case,

user_table
:id
end

role_table
:user_id
end

then your user should ‘belongs_to :role’ and role should ‘has_many
:users’ or ‘has_one :user’

If each user can have one role, but multiple users can have the same
role, then you need a ‘has_many’ for the role.

On Monday, April 10, 2006, at 8:19 AM, Tom M. wrote:

But is there not a way for it to map by using the role_id in the USERS

  • username varchar(64)

sounds
Posted via http://www.ruby-forum.com/.


Rails mailing list
[email protected]
http://lists.rubyonrails.org/mailman/listinfo/rails


Rails mailing list
[email protected]
http://lists.rubyonrails.org/mailman/listinfo/rails

_Kevin

Kevin O. wrote:

When you set up your associations, make the one that you want to have
the foreign key ‘belongs_to’ the one it is associated with.

In your case,

user_table
:id
end

role_table
:user_id
end

then your user should ‘belongs_to :role’ and role should ‘has_many
:users’ or ‘has_one :user’

If each user can have one role, but multiple users can have the same
role, then you need a ‘has_many’ for the role.

Hah, I knew it would be something simple. I typo’d and had the
belongs_to and has_many in the wrong models. Thanks.

On Apr 10, 2006, at 8:19 AM, Tom M. wrote:

having a row in the ROLES table for each user when all I really

  • username varchar(64)
    sounds
    like it should be really simple). Right now if I look at the user’s
    attributes the correct role_id is shown, but I get a no method
    error if
    I try and access user.role.

Do I need to do anything to tell rails to create a role model for
the
user?

You need to use has_one instead of has_many

Oops, my advice was wrong.

You want belongs_to.


– Tom M.