So I'm having an interesting issue with my database and associations.
I have three models, Users, Groups, and Roles. They are connected via a join table that has user_id, group_id, and role_id on the same table. A user is in a group, with a role. The same user can be in another group with another (or the same) role.
So, the user model has a has_and_belongs_to_many :roles, and the role model has a has_and_belongs_to_many :users, with the appropriate tags to make it work.
With this, @user.roles will grab a list of all roles associated with that user, and @role.users will grab all the users that have that role. Duplicates are possible.
One interesting behavior, was that, if the user and the role model both had a group_id column, then when @user.roles was called (and likewise @role.users), it would grab the group_id from the join_table for each role, instead of the group_id from users or roles. If I take out the group_id from users and roles, then it does not appear when I call @user.roles
This behavior is desirable, because then it lets me do things like,
@user.roles[@user.roles.index{|x| x.group_id==1}].name
to get the name of the role that the user has in group 1. Things like that.
So my question is, how can I get that functionality (grabbing the group_id when going through the join table) without the group_id columns in the user and role tables?
I've tried declaring group_id as attr_accessor :group_id for both user and role, but that didn't work.
The most important thing is being able to maintain the behavior, that I can call @user.roles[0].group_id, and @roles.user[0].group_id, with group_id being grabbed from the join table. Any way to do that would solve my problem.
Is there a way I can do it with definitions? like def self.Role.group_id or something like that?