0
votes

I currently have a setup that links the models User, Dealer and Role together. User and Dealer is many to many, and is working as expected with a Dealer_user assignment table.

The problem is that I want to have roles assigned to the user that are specific to the dealer also (i.e. a user could be a Sales Manager and a Parts Manager in one dealership, while being a Sales Manager and a Director in another).

In order to do this, I have a Role model (which belongs to a Role_type). Role should belong to Dealer_user, and Dealer_user has many Roles.

The intention is that I will be able to do

dealer.users.where(:id => user.id).first.roles
and it will return only the roles specific to that dealership.

The problem I have is that when I run the following test code:

dealer.users.where(:id => user.id).first.roles.create(:role_type_id => 1 + Random.rand(4))

I get an error:

Cannot modify association 'User#roles' because the source reflection class 'Role' is associated to 'DealerUser' via :has_many.

Can anyone suggest what I am doing wrong with my models (which are below)?

NOTE: The belongs_to relationship that Role has with Dealer_user is polymorphic because it could also belong to Sale_user or other association tables, which require the same functionality as Dealer.

class Dealer < ActiveRecord::Base
  attr_accessible :name, :address_id
  has_many :dealer_users
  has_many :users, :through => :dealer_users
  has_many :roles, :through => :dealer_users
end

class User < ActiveRecord::Base
  attr_accessible :first_name, :last_name
  has_many :dealer_users
  has_many :dealers, :through => :dealer_users
  has_many :roles, :through => :dealer_users
end

class DealerUser < ActiveRecord::Base
  attr_accessible :dealer_id, :user_id
  belongs_to :dealer
  belongs_to :user
  has_many :roles, :as => :role_originator
end

class Role < ActiveRecord::Base
  attr_accessible :role_type_id
  belongs_to :role_type
  belongs_to :role_originator, :polymorphic => true
end

Edit: No luck so far - can anyone help?

1

1 Answers

1
votes

I would use has_many through association with the roles table. Get rid of the dealer_user table, and add columns to the roles table dealer_id and user_id Then your models would look something like this:

class Dealer < ActiveRecord::Base
    has_many :users, :through => :roles
    has_many :roles
end

class User < ActiveRecord::Base
    has_many :dealers, :through => :roles
    has_many :roles
end

class Role < ActiveRecord::Base
    belongs_to :dealer
    belongs_to :user
end

That should make it easier to do the types of queries you're trying. The rails guide has a really good overview here