繁体   English   中英

Rails ActiveRecord has_many:通过多态关联

[英]Rails ActiveRecord has_many :through polymorphic association

我有以下模型:

class User < ActiveRecord::Base
  has_many :managements, class_name: 'Management', foreign_key: :manager_id
  has_many :primary_locations, -> { where managements:
    { manager_role: "primary" } }, through: :managements,
    source: :manageable, source_type: 'Location'
  has_many :secondary_locations, -> { where managements:
    { manager_role: "secondary" } }, through: :managements,
    source: :manageable, source_type: 'Location'
  has_many :primary_departments, -> { where managements:
    { manager_role: "primary" } }, through: :managements,
    source: :manageable, source_type: 'Department'
  has_many :secondary_departments, -> { where managements:
    { manager_role: "secondary" } }, through: :managements,
    source: :manageable, source_type: 'Department'
end

用户可以管理多个部门和位置,并且可以是每个部门的主要或次要管理员:

class Management < ActiveRecord::Base
  belongs_to :manager, class_name: 'User', foreign_key: :manager_id
  belongs_to :manageable, polymorphic: true
end

class Location < ActiveRecord::Base
  has_many :managements, class_name: "Management", foreign_key: :manageable_id,
    as: :manageable
  has_many :primary_managers, -> { where management:
    { manager_role: "primary" } }, through: :managements, source: :manager
  has_many :secondary_managers, -> { where management:
    {manager_role: "secondary"} }, through: :managements, source: :manager
end

class Department < ActiveRecord::Base
  has_many :managements, class_name: "Management", foreign_key: :manageable_id,
    as: :manageable
  has_many :primary_managers, -> { where management:
    { manager_role: "primary" } }, through: :managements, source: :manager
  has_many :secondary_managers, -> { where management:
    {manager_role: "secondary"} }, through: :managements, source: :manager
end

当我调用user.primary_departments时,以下关联会产生错误:

SELECT "departments".* FROM "departments" INNER JOIN "managements" ON
  "departments"."id" = "managements"."manageable_id" WHERE
  "managements"."manager_role" = 'primary' AND "managements"."manager_id" = $1
   AND "departments"."manageable_type" = 'Department'  [["manager_id", 1]]
PG::UndefinedColumn: ERROR:  column department.manageable_type does not exist

location.primary_managers关联起作用。 因此,除了将多态类型指向错误的表之外,它似乎几乎可以正常工作。 如何指定在management表上找到manageable_type

我最终将其添加到User类:

%w(department location).each do |type|
  %w(primary secondary).each do |role|
    define_method("#{role}_managed_#{type}s") do
      klass = type.capitalize.constantize
      klass.joins("#{role}_managers".to_sym).where('manager_id = ?', id)
    end
  end
end

它添加了4种方法: primary_managed_departmentssecondary_managed_departmentsprimary_managed_locationssecondary_managed_locations 这是一种适合我们需求的解决方法,但是可能我还缺少其他东西。 我主要将这个答案留给@ janko-m,因为我无法在注释中添加格式化的代码,因此随时可以使用更好的解决方案进行回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM