Rails 与相同关系的多个实例关联
Rails association with multiple instances of same relation
我有 2 个模型,Employee
和 Approval
。我想建立一个协会,这样 :approval
belongs_to
2 名不同的员工(1 名经理,1 名下属)。我该如何设置?我希望能够为经理和下属拉取所有批准。
您可以在 belongs_to
和 has_many
上显式声明 class_name
,在 has_many
上显式声明 foreign_key
class Approval < ApplicationModel
belongs_to :manager, class_name: 'Employee'
belongs_to :subordinate, class_name: 'Employee'
end
class Employee < ApplicationModel
has_many :manager_approvals, foreign_key: :manager_id, class_name: 'Approval'
has_many :subordinate_approvals, foreign_key: :subordinate_id, class_name: 'Approval'
end
文档:
1 => 添加迁移将 manager_id
列添加到 Employee
rails g migration add_manager_id_to_employee manager_id:integer
2 => 员工模型的自我参照关联
class Employee < ApplicationRecord
belongs_to :manager, optional: true
has_many : subordinates, :class_name => "Employee", :foreign_key => "manager_id"
end
3 =>
class Approval < ApplicationRecord
belongs_to :employee
has_one :manager, { where("employees.manager_id= nil ") }
has_one :subordinate, { where("employees.manager_id= self.employee_id") }
end
我有 2 个模型,Employee
和 Approval
。我想建立一个协会,这样 :approval
belongs_to
2 名不同的员工(1 名经理,1 名下属)。我该如何设置?我希望能够为经理和下属拉取所有批准。
您可以在 belongs_to
和 has_many
上显式声明 class_name
,在 has_many
foreign_key
class Approval < ApplicationModel
belongs_to :manager, class_name: 'Employee'
belongs_to :subordinate, class_name: 'Employee'
end
class Employee < ApplicationModel
has_many :manager_approvals, foreign_key: :manager_id, class_name: 'Approval'
has_many :subordinate_approvals, foreign_key: :subordinate_id, class_name: 'Approval'
end
文档:
1 => 添加迁移将 manager_id
列添加到 Employee
rails g migration add_manager_id_to_employee manager_id:integer
2 => 员工模型的自我参照关联
class Employee < ApplicationRecord
belongs_to :manager, optional: true
has_many : subordinates, :class_name => "Employee", :foreign_key => "manager_id"
end
3 =>
class Approval < ApplicationRecord
belongs_to :employee
has_one :manager, { where("employees.manager_id= nil ") }
has_one :subordinate, { where("employees.manager_id= self.employee_id") }
end