【问题标题】:Rails ActiveRecord has_many :through polymorphic associationRails ActiveRecord has_many:通过多态关联
【发布时间】:2013-11-19 10:19:10
【问题描述】:

我有这些模型:

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 关联有效。所以它似乎几乎可以工作,除了多态类型指向错误的表。如何指定 manageable_type 在 management 表中找到?

【问题讨论】:

  • 您有一个错字问题:在 where 方法中始终使用复数名称:where( managements: { manager_role: 'primary' } )(注意 managements 上的复数)
  • 谢谢。实际上,为了简化问题,我已经审查了不同的表名。我将进行编辑以反映问题中的表名。
  • 我也有同样的问题。肯定会很感激一个解决方案。但是当我从头开始制作多态结构时,一切正常。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我最终将它添加到 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_departments、secondary_managed_departments、primary_managed_locations 和 secondary_managed_locations。这是一种适合我们需求的解决方法,但我可能还缺少其他东西。我将这个答案主要留给@janko-m,因为我无法将格式化的代码放在评论中,所以请随时用更好的解决方案来回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 2016-03-20
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多