Ruby on Rails:查找某个类别中的所有主题?

and*_*ndy 2 ruby ruby-on-rails

我试图找到一个特定类别中的所有主题,但我不确定这是否是最有效的方法:

Topic.all.select { |topic| topic.categories.include?(category) }
Run Code Online (Sandbox Code Playgroud)

上面的工作对我来说似乎需要MySQL很长时间才能找到记录.还有什么更有效的吗?

Jai*_*yer 7

听起来好像你现在在主题和类别之间有一个很好的关系,当你需要多对多的关系时.像这样重构你的模型:

# 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
Run Code Online (Sandbox Code Playgroud)

然后创建没有主键的连接表.像这样创建新的迁移:

script/generate migration AddCategoriesTopicsJoinTable
Run Code Online (Sandbox Code Playgroud)

并添加以下内容:

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
Run Code Online (Sandbox Code Playgroud)

请注意,连接表是通过按字母顺序组合两个表名来命名的.这就是Rails将如何自动找到它的方法.

现在,您可以调用@category.topics并获取一系列主题,然后您可以调用@topic.categories并获取类别.它适用于两个方向.

更新:关于Rails中多对多关系的问题经常出现,我写了一篇名为基本多对多关联的文章来解释如何使用habtmvs has_many :through,以及它们之间的差异.