2
我试图找到一个特定类别的所有主题,但我不知道这是否是最有效的方式做到这一点:Ruby on Rails:查找某个类别中的所有主题?
Topic.all.select { |topic| topic.categories.include?(category) }
上述工作对我来说,但它似乎需要很长时间才能找到记录。有什么更有效率吗?
我试图找到一个特定类别的所有主题,但我不知道这是否是最有效的方式做到这一点:Ruby on Rails:查找某个类别中的所有主题?
Topic.all.select { |topic| topic.categories.include?(category) }
上述工作对我来说,但它似乎需要很长时间才能找到记录。有什么更有效率吗?
这听起来像是现在你在主题和类别之间有一个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
的文章,以及它们之间的差异。
这是伟大的海梅。非常感谢! – andy 2010-01-29 18:34:54
不客气,我很高兴它帮助:) – 2010-01-29 20:02:55