简体   繁体   中英

Confused about Ruby on Rails Active Record structure

I'm having trouble coming up with a way to structure my models to the the following:

I have Users through Devise - Users can have a role of (amongst others) Sales, Admin and Client. This is set through a HABTM with the Role model. I've set up a method so I can do the following

user.is? :Client

What I need is the following:

  • Users that have the Role of Sales can have any amount of clients.

So when a SalesPerson logs on, I can do User.clients to fetch all clients related to them.

  • Users that have the Role of Client can only have one client.

When a new Client signs up online, I want to create their user trough devise, and then also create a client through nested values, linked to the user they created.

  • Clients should have one SalesAgent, using the User model

When viewing the client, one should be able to have a dropdown to select the SalesAgent from. This should, as above, use the User model.

  • Clients should have only one Devise User with the role of Client, using the User class

Clients should be able to log on through devise to access their details, track orders, etc.

As you can see, this is incredibly confusing, and I'm not sure what the best way would be to pull this off. The only thing I can think of would be to use a HABTM between Users and Clients, and then Joins and hacks in the forms to make it work. Is there a better way to do this? I've looked at perhaps using

has_one :sales_agent, :class_name => "User"

But can't get it working. :/

Rather than overloading the User class with a roll-your-own single table inheritance scheme, it's often better to break out the roles in the db. It sure makes things clearer at this stage, and it's a better way to store data specific to clients or sales agents that don't belong to any user. Eg:

class User < ActiveRecord::Base
  has_many :clients
  has_many :sales_agents
end

class Client < ActiveRecord::Base
  belongs_to :user
  belongs_to :sales_agent
end

class SalesAgent < ActiveRecord::Base
  belongs_to :user
  has_many :clients
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM