Ruby on Rails: найти все темы в определенной категории? - PullRequest
2 голосов
/ 29 января 2010

Я пытаюсь найти все темы в одной определенной категории, но я не уверен, что это самый эффективный способ сделать это:

Topic.all.select { |topic| topic.categories.include?(category) }

Вышесказанное работает для меня, но, похоже, MySQL занимает много времени, чтобы найти записи. Есть ли что-нибудь более эффективное?

1 Ответ

7 голосов
/ 29 января 2010

Похоже, что сейчас у вас есть отношение 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 и различия между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...