Ruby on rails 经理->;rails中的一级员工关联
我想创建经理->员工协会Ruby on rails 经理->;rails中的一级员工关联,ruby-on-rails,ruby,model-associations,rails-models,Ruby On Rails,Ruby,Model Associations,Rails Models,我想创建经理->员工协会 经理有很多员工 员工只属于一名经理 经理没有其他经理 如何实现这个设计? 我创建了一些更接近的东西(代码如下),但在我的设计经理可以有其他经理 class User < ApplicationRecord has_many :employee, class_name: "User", foreign_key: "manager_id" belongs_to :manager, class_name: "User", foreign_key: "mana
- 经理有很多员工
- 员工只属于一名经理
- 经理没有其他经理
class User < ApplicationRecord
has_many :employee, class_name: "User", foreign_key: "manager_id"
belongs_to :manager, class_name: "User", foreign_key: "manager_id"
end
class用户
非常感谢您的帮助 我认为最好在您的表中再增加一个字段
manager:boolean
。根据此字段,您可以决定用户是否为经理。此外,您还可以添加验证,如果管理器字段为true,则管理器id必须为空
validate :manager_id_blank_for_manager
has_many :employees, class_name: "User", foreign_key: "manager_id", dependent: :restrict_with_exception
scope :managers, ->{ where(manager: true) }
def manager?
manager
end
private
def manager_id_blank_for_manager
if manager_id.present? && manager?
errors.add(:manager_id, :must_be_blank_for_manager) # Move this error to yml file
end
end
我认为最好在您的表中再增加一个字段
manager:boolean
。根据此字段,您可以决定用户是否为经理。此外,您还可以添加验证,如果管理器字段为true,则管理器id必须为空
validate :manager_id_blank_for_manager
has_many :employees, class_name: "User", foreign_key: "manager_id", dependent: :restrict_with_exception
scope :managers, ->{ where(manager: true) }
def manager?
manager
end
private
def manager_id_blank_for_manager
if manager_id.present? && manager?
errors.add(:manager_id, :must_be_blank_for_manager) # Move this error to yml file
end
end
您拥有的是真正标准的自连接设置(有一些小问题)。只需添加自定义验证即可限制树的深度:
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
第三行将引发
ActiveRecord::RecordInvalid:验证失败:Manager不是Manager
您拥有的是一个真正标准的自加入设置(有一些小问题)。只需添加自定义验证即可限制树的深度:
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
第三行将引发
ActiveRecord::RecordInvalid:验证失败:经理不是经理
您如何知道谁是经理,谁不是?您是否有将用户标记为管理员的属性?或者,如果用户至少有一名员工,则该用户是否为经理?(在最后一种情况下,您不能没有任何员工的经理。)@3limin4t0r在manager\u id
为nil
之前,用户都是经理,或者如果需要为经理添加一个布尔属性,我可以添加。您如何知道谁是经理,谁不是?您是否有将用户标记为管理员的属性?或者,如果用户至少有一名员工,则该用户是否为经理?(在最后一种情况下,您不能没有任何员工的经理。)@3limin4t0r在manager\u id
为nil
之前,用户是经理,或者如果需要,我可以为经理添加一个布尔属性。不过,还有一些边缘情况需要注意。就像你做u=User.new(管理者:User\u 1);u、 新员工;u、 救命!“
它不会引发错误。它只是不会持久化员工。如何限制该边缘大小写?您可以使用引发异常的关联回调。但是有一些边缘大小写需要注意。例如,如果您执行u=User.new(manager:User\u 1);u.employees.new;u.save!”
它不会引发错误。它只是不能持久化员工。如何限制边缘情况?可以使用引发异常的关联回调。