and*_*ndy 2 ruby ruby-on-rails
我试图找到一个特定类别中的所有主题,但我不确定这是否是最有效的方法:
Topic.all.select { |topic| topic.categories.include?(category) }
Run Code Online (Sandbox Code Playgroud)
上面的工作对我来说似乎需要MySQL很长时间才能找到记录.还有什么更有效的吗?
听起来好像你现在在主题和类别之间有一个很好的关系,当你需要多对多的关系时.像这样重构你的模型:
# 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,以及它们之间的差异.
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |