导轨的ActiveRecord的has_many:通过多态关联

问题描述:

我有这些模型:导轨的ActiveRecord的has_many:通过多态关联

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

+0

您有一个错字问题:在where方法中总是使用复数名称:'where(managements:{manager_role:'primary'})'(注意管理上的复数) – MrYoshiji

+0

谢谢。其实我有不同的表格名称,为了简化问题我已经审查过。我将编辑以反映问题中的表名。 –

+0

我有完全相同的问题。肯定会喜欢解决方案。但是当我从头开始构造一个多态结构时,一切都有效。 –

我结束了添加此为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离开这个答案,因为我不能将格式化的代码放入注释中,所以请随时用更好的解决方案来回答。