2015-01-28 5 views
2

Я пытаюсь понять обратные полиморфные ассоциации в Rails. Я следовал this guide, но у меня есть ошибка. Когда я пишу some_type_object.clubs он работает довольно хорошо, но когда я пытаюсь some_club_object.type я получаю сообщение об ошибке:Рельсы. Обратные полиморфные ассоциации

ActiveRecord::HasManyThroughAssociationNotFoundError: Could not find the association :type_elements in model Club 

Как это исправить?

Вот мои модели:

class Club < ActiveRecord::Base 
    has_one :type_element, as: :element 
    has_one :type, through: :type_elements 
end 

class Event < ActiveRecord::Base 
    has_one :type_element, as: :element 
    has_one :type, through: :type_elements 
end 

class Type < ActiveRecord::Base 
    has_many :type_elements 
    has_many :clubs, through: :type_elements, source: :element, source_type: 'Club' 
    has_many :events, through: :type_elements, source: :element, source_type: 'Event' 
end 

class TypeElement < ActiveRecord::Base 
    belongs_to :type 
    belongs_to :element, polymorphic: true 
end 

Мои Миграции:

class CreateClubs < ActiveRecord::Migration 
    def change 
    create_table :clubs do |t| 
     t.string :name 
     t.belongs_to :type 
     t.timestamps null: false 
    end 
    end 
end 

class CreateEvents < ActiveRecord::Migration 
    def change 
    create_table :events do |t| 
     t.string :name 
     t.belongs_to :type 
     t.timestamps null: false 
    end 
    end 
end 

class CreateTypeElements < ActiveRecord::Migration 
    def change 
    create_table :type_elements do |t| 
     t.belongs_to :type, index: true 
     t.integer :element_id 
     t.string :element_type 

     t.timestamps null: false 
    end 
    add_foreign_key :type_elements, :types 
    add_foreign_key :type_elements, :elements 
    end 
end 

class CreateTypes < ActiveRecord::Migration 
    def change 
    create_table :types do |t| 
     t.string :name 
     t.timestamps null: false 
    end 
    end 
end 

ответ

2

Попробуйте это:

class Club < ActiveRecord::Base 
    has_one :type_element, as: :element 
    has_one :type, through: :type_element # <- change 
end 

Я думаю, что вы должны быть в порядке, имеющие тип как класс. Вы не должны иметь его как поле, если вы действительно не хотите STI.

+0

Большое спасибо, это помогло. – skowl

0

Вы никогда не должны иметь столбец с именем миграции type. Это зарезервированное слово ruby ​​/ rails и вызывает проблемы, если у вас что-то названо. Я считаю, что это верно и для имен моделей, но не для 100%. Измените любые имена от type на что-то еще, и эти ошибки исчезнут.

+0

После переименования таблиц типов я получил ту же ошибку. – skowl

+0

Я думаю, что @evanbikes верен. С вашим старым кодом у вас есть 'has_one: type_element, как:: element', а затем' has_one: type, through:: type_elements'. Измените ': type_elements' на': type_element', и вы должны быть хорошими (конечно, учет ваших изменений имени). –

Смежные вопросы