Отношения модели Rails, роли пользователей

#ruby-on-rails #orm

#ruby-on-rails #orm

Вопрос:

Я задавал аналогичный вопрос пару дней назад, но понял, что задал его не совсем правильно.
В приложении Rails с моделями Manager и Employee допустим, что все менеджеры являются сотрудниками, но не все сотрудники являются менеджерами. Мне нужно было решение, позволяющее пользователю выступать в качестве менеджера и сотрудника, оба из которых имеют разные атрибуты и методы.

Мне сказали использовать наследование одной таблицы, что очень полезно, но это дало пользователю свойства обеих таблиц одновременно. Чего бы я хотел, так это чтобы пользователь (не каждый пользователь) мог действовать как менеджер и сотрудник, но не оба одновременно.
Таким образом, некоторые пользователи могут быть либо менеджером, либо сотрудником, но не обоими сразу. Некоторые пользователи могут быть только сотрудниками.

Есть идеи о том, какие отношения я должен использовать для этого?

Комментарии:

1. Вы можете установить type атрибут в users таблице, в которой хранятся два значения manager и employee . Затем вы можете вызвать User.where(:type => 'manager') or User.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. То, что вы используете внутренне для входа пользователя, полностью зависит от вас. Я бы использовал модель пользователя для общих операций (аутентификация), но сотрудника / менеджера для конкретных вещей, таких как авторизация (где сотрудник / менеджер будет выступать в качестве ролей). На самом деле я недостаточно знаю о вашем приложении, чтобы сделать соответствующее предложение.