2013-11-14 46 views
0

我有這些模型:導軌的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

我有完全相同的問題。肯定會喜歡解決方案。但是當我從頭開始構造一個多態結構時,一切都有效。 –

回答

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離開這個答案,因爲我不能將格式化的代碼放入註釋中,所以請隨時用更好的解決方案來回答。