2016-04-03 75 views
0

我開始學習更高級的關聯,並且多態連接表看起來很有趣,但是我遇到了一個不好的限制。Rails多態連接表工作雙向

我的模型:

school_class.rb:

class SchoolClass < ActiveRecord::Base 
    has_many :class_of_schools, as: :school_model, dependent: :destroy 
    has_many :basic_primary_schools, through: :class_of_schools 
    has_many :basic_shugenja_schools, through: :class_of_schools 
    has_many :basic_monk_schools, through: :class_of_schools 
end 

class_of_school.rb:

class ClassOfSchool < ActiveRecord::Base 
    belongs_to :school_model, polymorphic: true 
    belongs_to :school_class 
end 

basic_primary_School.rb:

class BasicPrimarySchool < ActiveRecord::Base 

    has_many :class_of_schools, as: :school_model, dependent: :destroy 
    has_many :school_classes, through: :class_of_schools 
end 

shugenja_school和monk_schools,與basic_primary_school具有相同的關聯。

並加入模型,可以自:

class CreateClassOfSchools < ActiveRecord::Migration 
    def change 
    create_table :class_of_schools do |t| 
     t.integer :school_class_id 
     t.integer :school_model_id 
     t.string :school_model_type 

     t.timestamps null: false 
    end 
    end 
end 

它加入以及在校一面,我可以讓school.class_schools,我也得到相關school_classes的陣列。但在另一方面,我不能這樣做。事實上,當我檢查school_class.classes_of學校時,我得到空陣列。 我讓我的種子文件關聯按功能如下:

def join_schools_with_classes(school_object_name, school_classes_array) 
    school_object_name.all.each do |school| 
    school_classes = school_classes_array[school.name] 
    school_classes.each do |class_name| 
     school_class = SchoolClass.find_by(name: class_name) 
     school.class_of_schools.create(school_class_id: school_class.id) 
    end 
    end 
end 

我的問題:

我怎樣才能讓這個關聯是雙向的?所以我可以撥打ClassSchool.first.class_of_schools返回,所有與此對象關聯的對象。仍然可以撥打BasicPrimarySchool.first.school_classes獲取關聯的school_class對象。

回答

0

只是刪除as: :school_model在SchoolClass關係

has_many :class_of_schools, dependent: :destroy 

編輯

變化SchoolClass

has_many :basic_primary_schools, through: :class_of_schools, source: :school_model, source_type: "BasicPrimarySchool"

+0

它的工作作爲school_class.classes_of_school現在返回數組的關係那些對象:) 但是當我嘗試獲得SchoolClass.first.basic_primary_schools時,我得到'ActiveRecord :: HasManyThroughSourceAssociationNotFoundError:找不到源關聯' – Kazik

+0

檢查編輯以解決該問題 –

+1

正確的答案是'has_many:basic_primary_schools,通過::class_of_schools,來源::school_model,source_type:「BasicPrimarySchool」'但我會將答案標記爲正確,請更新它。 – Kazik