2010-01-29 78 views
2

我试图找到一个特定类别的所有主题,但我不知道这是否是最有效的方式做到这一点:Ruby on Rails:查找某个类别中的所有主题?

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

上述工作对我来说,但它似乎需要很长时间才能找到记录。有什么更有效率吗?

回答

7

这听起来像是现在你在主题和类别之间有一个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并获取类别。它可以在两个方向上工作。

UPDATE:关于Rails的许多一对多的关系问题已经拿出往往不够,我编写了一个名为basic many-to-many associations解释如何使用habtm VS has_many :through的文章,以及它们之间的差异。

+0

这是伟大的海梅。非常感谢! – andy 2010-01-29 18:34:54

+0

不客气,我很高兴它帮助:) – 2010-01-29 20:02:55