Chris Muench
Chris Muench

Reputation: 18338

Ruby On Rails Hierarchical Relationship Modeling

I have a base table called users which holds all common information about a user such as name, address, phone number...etc

I have another table called clients which holds specific information about a client (such as the client's company name and their url) and inherits user information from the users table. A client has a foreign key user_id which maps back to the information about a user.

I have another table called client_admins which hold specific information about client_admins and also has a user_id field AND a client_id field (which links to the clients table).

I have another table called super_admins which links to the users table and has specific information about a Super admin.

I know I could probably get away with Single Table Inheritance as there is not a lot of different data between each of the types, just different functionality and privileges.

What is the best way to model this in Rails 3?

Upvotes: 6

Views: 1458

Answers (2)

Pete Hamilton
Pete Hamilton

Reputation: 7920

I am unsure of whether this is exactly what you were aiming for, but with my citier gem you could do this:

class User < ActiveRecord::Base
   acts_as_citier
   # User methods and validation, inherited by all children (so client & super admins)
   # Useful for things like validating user permissions etc
end

class Admin < User
   acts_as_citier
   # Admin specific methods and validation, inherited by all children
end

class Client < ActiveRecord::Base
end

class ClientAdmin < Admin
   acts_as_citier
   belongs_to :client
   # Client admin specific methods and validation
end

class SuperAdmin < Admin
   acts_as_citier
   # Super admin specific methods and validation
end

Allows each model to have unique fields so better than STI, but also shares methods and properties like normal inheritance.

Check it out - http://peterhamilton.github.com/citier/

Upvotes: 0

Amokrane Chentir
Amokrane Chentir

Reputation: 30405

Inside your user model:

has_one :client
has_one :client_admin
has_one :super_admin

Inside your client model:

belongs_to :user
has_one :client_admin

Inside your client_admin model:

belongs_to :user
belongs_to :client

Inside your super_admin model:

belongs_to :user

Upvotes: 2

Related Questions