Моделирование иерархических отношений Ruby On Rails - PullRequest
6 голосов
/ 22 февраля 2011

У меня есть базовая таблица, называемая users, которая содержит всю общую информацию о пользователе, такую ​​как имя, адрес, номер телефона ... и т.д.такие как название компании клиента и их URL) и наследует информацию пользователя из таблицы пользователей.У клиента есть внешний ключ user_id, который сопоставляется с информацией о пользователе.

У меня есть другая таблица под названием client_admins, которая содержит конкретную информацию о client_admins, а также имеет поле user_id И поле client_id (которое ссылается натаблица клиентов).

У меня есть еще одна таблица, которая называется super_admins, которая связана с таблицей пользователей и содержит конкретную информацию о суперпользователе.

Я знаю, что, возможно, мне не помешает наследование одной таблицы, так как тамне много разных данных между каждым типом, просто разные функциональные возможности и привилегии.

Как лучше всего смоделировать это в Rails 3?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2011

Внутри вашей пользовательской модели:

has_one :client
has_one :client_admin
has_one :super_admin

Внутри вашей клиентской модели:

belongs_to :user
has_one :client_admin

Внутри вашей модели client_admin:

belongs_to :user
belongs_to :client

Внутри вашей модели super_admin:

belongs_to :user
0 голосов
/ 05 мая 2011

Я не уверен, к чему вы стремились, но с моей драгоценностью citier вы могли бы сделать это:

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

Позволяет каждой модели иметь уникальные поля лучше, чем STI, но такжеразделяет методы и свойства, такие как обычное наследование.

Проверьте это - http://peterhamilton.github.com/citier/

...