#ruby-on-rails #orm
#ruby-on-rails #orm
Вопрос:
Я задавал аналогичный вопрос пару дней назад, но понял, что задал его не совсем правильно.
В приложении Rails с моделями Manager и Employee допустим, что все менеджеры являются сотрудниками, но не все сотрудники являются менеджерами. Мне нужно было решение, позволяющее пользователю выступать в качестве менеджера и сотрудника, оба из которых имеют разные атрибуты и методы.
Мне сказали использовать наследование одной таблицы, что очень полезно, но это дало пользователю свойства обеих таблиц одновременно. Чего бы я хотел, так это чтобы пользователь (не каждый пользователь) мог действовать как менеджер и сотрудник, но не оба одновременно.
Таким образом, некоторые пользователи могут быть либо менеджером, либо сотрудником, но не обоими сразу. Некоторые пользователи могут быть только сотрудниками.
Есть идеи о том, какие отношения я должен использовать для этого?
Комментарии:
1. Вы можете установить
type
атрибут вusers
таблице, в которой хранятся два значенияmanager
иemployee
. Затем вы можете вызватьUser.where(:type => 'manager')
orUser.where(:type => 'employee')
для разграничения пользователей.2. Что, если бы я хотел, чтобы у сотрудников были другие атрибуты и методы, чем у менеджеров?
3. «все менеджеры являются сотрудниками» … «иметь возможность действовать как менеджер и сотрудник, но не оба одновременно». … «некоторые пользователи могут быть либо менеджером, либо сотрудником, но не обоими сразу» <<< Это слишком противоречиво.
4. Я имел в виду, что менеджер действует как менеджер для своих сотрудников, но действует как сотрудник для своего менеджера / босса.
Ответ №1:
Вы могли бы использовать STI следующим образом:
структура
create_table :users do |t|
t.string :name
t.string :type # index this
end
Источник
class User < ActiveRecord::Base
# attributes -- name, type
def to_s
"#{name} (Generic User)"
end
end
class Manager < User
def to_s
"#{name} (Manager)"
end
end
class Employee < User
def to_s
"#{name} (Employee)"
end
end
примеры
puts User.new(name: "Mr User")
# => "Mr User (Generic User)"
puts Manager.new(name: "Mr Manager")
# => "Mr Manager (Manager)"
puts Employee.new(name: "Mr Employee")
# => "Mr Employee (Employee)"
Комментарии:
1. Итак, вы предлагаете мне либо войти в систему пользователя из таблицы employees или managers?
2. @user3806756 при использовании STI нет таблицы employees или managers, есть только таблица users со столбцом type. То, что вы используете внутренне для входа пользователя, полностью зависит от вас. Я бы использовал модель пользователя для общих операций (аутентификация), но сотрудника / менеджера для конкретных вещей, таких как авторизация (где сотрудник / менеджер будет выступать в качестве ролей). На самом деле я недостаточно знаю о вашем приложении, чтобы сделать соответствующее предложение.