То, что у вас есть, - это действительно стандартная самосоединяющаяся установка (с несколькими небольшими проблемами). Вы можете ограничить глубину дерева, просто добавив пользовательскую проверку:
class User < ApplicationRecord
# optional: true is needed in Rails 5+ since belongs_to is no
# longer optional by default
belongs_to :manager, class_name: 'User',
optional: true
# pay attention to pluralization
has_many :employees, class_name: 'User',
foreign_key: 'manager_id'
# calls the custom validation we will define later
validate :manager_must_be_a_manager, unless: :manager?
def manager?
manager.nil?
end
private
# our custom validation method
def manager_must_be_a_manager
errors.add(:manager, 'is not a manager') unless manager.manager?
end
end
Так что теперь, если мы запустим:
user_1 = User.create!
user_2 = User.create!(manager: user_1)
User.create!(manager: user_2)
Третья строка повысит ActiveRecord::RecordInvalid: Validation failed: Manager is not a manager
.