has_many中的has_one

时间:2012-12-03 20:46:06

标签: ruby-on-rails-3 activerecord

我有一个与我挣扎的关联。我有一个部门模型,可以有很多工作人员,其中一个是经理。

我需要能够打电话。

Department.staff - 并获得包括经理在内的所有员工的集合。 Department.manager - 并获得经理。

User.department - 获取用户部门,无论他们是员工还是经理。 User.is_manager - 并获取关于他们是否管理部门的布尔值。 User.manages - 获得他们管理的部门。

建立此关联的最佳方法是什么?我目前开始使用这样的东西:

class User < ActiveRecord::Base
      belongs_to :department
      has_one :manages, :class_name => 'Department', :foreign_key => :manager_id
end

class Department < ActiveRecord::Base
      belongs_to :manager, :class_name => "User"
      has_many :staff, :class_name 'Users'
end

我遇到的问题是,我必须将经理既作为经理又作为员工加入,感觉有点笨拙 - 但也许我有点挑剔?

有人可以建议一些更好的选择吗?

1 个答案:

答案 0 :(得分:1)

尝试此关联:

class Department < ActiveRecord::Base
  has_many :staffs, class_name: "User"
  has_one :manager, class_name: "User", foreign_key: "manager_id"
end

class User < ActiveRecord::Base
  belongs_to :department
end

确保您的User表格中有一个名为manager_id的列,以及一个名为department_id的列。如果您的manager表中有一个名为User的布尔列,您将有一个方法manager?来检查用户是否是经理。

做你想做的事:

@department = Department.find(1) # Find department with id = 1
@department.staffs # Get all staffs of department

@department.manager.name # Get name of manager of department

@user = User.find(1) # Find user with id = 1
@user.department.name # Get name of department which user belongs to
@user.manager? # Return value of manager column