Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 经理->;rails中的一级员工关联_Ruby On Rails_Ruby_Model Associations_Rails Models - Fatal编程技术网

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!”
它不会引发错误。它只是不能持久化员工。如何限制边缘情况?可以使用引发异常的关联回调。