Multiple relationships between models

Hi, I'm fairly new to RoR and I'm trying to figure out the best way to deal with Users in my application. I've got (for the purpose of this thread) 3 models, User, Subject, and SubjectUserAssignment.

The user model is joined to the Subject model with the following, creating a many to many relationship between User and Subject:

has_many :subjects, :through => :subject_user_assignments has_many :subject_user_assignments

Likewise, the Subject model:

has_many :users, :through => :subject_user_assignments has_many :subject_user_assignments belongs_to :user, :foreign_key => "user_id_created" belongs_to :user, :foreign_key => "user_id_updated"

This works fine, I can return all users for a given subject, and all subjects for a given user. The problem is that the Subject model has user_id_created and user_id_updated fields, which contain the user_id of the user(s) who created and updated the subject. So a user can either be related to a subject because they're assigned to it, or because they created/updated it, or both. How do I go about specifying this in my User model? User.subjects should return all subjects assigned to a user, but I need something else like User.created_subjects to show all subjects created by a user. Am I using :foreign_key correctly in the Subject model?

Al Rowan wrote in post #960389:

Hi, I'm fairly new to RoR and I'm trying to figure out the best way to deal with Users in my application. I've got (for the purpose of this thread) 3 models, User, Subject, and SubjectUserAssignment.

The user model is joined to the Subject model with the following, creating a many to many relationship between User and Subject:

has_many :subjects, :through => :subject_user_assignments has_many :subject_user_assignments

I would urge you to find a more descriptive name than SubjectUserAssignment. Perhaps Assignment or even Interest might be better.

Likewise, the Subject model:

has_many :users, :through => :subject_user_assignments has_many :subject_user_assignments belongs_to :user, :foreign_key => "user_id_created" belongs_to :user, :foreign_key => "user_id_updated"

This works fine, I can return all users for a given subject, and all subjects for a given user. The problem is that the Subject model has user_id_created and user_id_updated fields, which contain the user_id of the user(s) who created and updated the subject. So a user can either be related to a subject because they're assigned to it, or because they created/updated it, or both. How do I go about specifying this in my User model? User.subjects should return all subjects assigned to a user, but I need something else like User.created_subjects to show all subjects created by a user. Am I using :foreign_key correctly in the Subject model?

You're using :foreign_key correctly, but you're not using belongs_to correctly. Remember that the first argument to belongs_to is the name of the *association*, not necessarily the class or table. So right now, you're creating two different associations called user (presumably one is overwriting the other). What you want is something like belongs_to :creator, :foreign_key => 'user_id_created', :class_name => 'User' belongs_to :updater, :foreign_key => 'user_id_updated', :class_name => 'User'

Please refer to the belongs_to rdoc for more info on how this all works.

Best,

Al Rowan wrote in post #960389:

Hi, I'm fairly new to RoR and I'm trying to figure out the best way to deal with Users in my application. I've got (for the purpose of this thread) 3 models, User, Subject, and SubjectUserAssignment.

The user model is joined to the Subject model with the following, creating a many to many relationship between User and Subject:

has_many :subjects, :through => :subject_user_assignments has_many :subject_user_assignments

Likewise, the Subject model:

has_many :users, :through => :subject_user_assignments has_many :subject_user_assignments belongs_to :user, :foreign_key => "user_id_created" belongs_to :user, :foreign_key => "user_id_updated"

This works fine, I can return all users for a given subject, and all subjects for a given user. The problem is that the Subject model has user_id_created and user_id_updated fields, which contain the user_id of the user(s) who created and updated the subject. So a user can either be related to a subject because they're assigned to it, or because they created/updated it, or both. How do I go about specifying this in my User model? User.subjects should return all subjects assigned to a user, but I need something else like User.created_subjects to show all subjects created by a user. Am I using :foreign_key correctly in the Subject model?

First, unless you fear naming conflicts I think and Assignment model would stand on it's own so I'll present my suggestion based on that.

User

Robert Walker wrote in post #960397:

has_many :last_updated_subjects, :class => "Subject", :foreign_key => :last_updated_by_id

Correction: Should have been :class_name not :class

has_many :last_updated_subjects, :class_name => "Subject", :foreign_key => :last_updated_by_id