2016-04-03 70 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