Похоже, что сейчас у вас есть отношение has_many между темами и категориями, когда вам нужно отношение «многие ко многим». Перестройте ваши модели так:
# app/models/category.rb
class Category < ActiveRecord::Base
has_and_belongs_to_many :topics
end
# app/models/topic.rb
class Topic < ActiveRecord::Base
has_and_belongs_to_many :categories
end
Затем создайте таблицу соединений без первичного ключа. Создайте новую миграцию так:
script/generate migration AddCategoriesTopicsJoinTable
И добавить это содержимое:
class AddCategoriesTopicsJoinTable < ActiveRecord::Migration
def self.up
create_table :categories_topics, :id => false do |t|
t.integer :category_id
t.integer :topic_id
end
end
def self.down
drop_table :categories_topics
end
end
Обратите внимание, что объединяемая таблица именуется путем объединения двух имен таблиц в алфавитном порядке. Вот как Rails узнает, как найти его автоматически.
Теперь вы можете позвонить @category.topics
и получить массив тем, а вы можете позвонить @topic.categories
и получить категории. Работает в обоих направлениях.
ОБНОВЛЕНИЕ: вопросы о взаимоотношениях многие-ко-многим в Rails возникали достаточно часто, и я написал статью под названием базовые ассоциации многие-ко-многим , чтобы объяснить, как использовать habtm
против has_many :through
и различия между ними.