0

这个标题听起来很奇怪,所以让我试着解释一下我想要完成的事情。

假设我有一个 Category 模型,结构看起来有点像这样:

类别

ID

姓名

parent_id


我也有文章的模型

文章

id category_id


如果我有一个名为“新闻”的类别,其 id:1,然后有一个名为“世界新闻”的子类别,其 id:2 和 parent_id:1,如果我有一篇文章的 category_id:1 和另一篇文章的 category_id: 2,我希望能够做类似的事情:

category = Category.find 2 # This is the subcategory
category.articles # => Shows just the article belonging to that category

category = Category.find 1 # This is the parent category
category.articles # => Shows BOTH articles, the one for the child and the one for parent

那有意义吗?

4

1 回答 1

1

您正在寻找的是您的类别的树结构。Usingparent_id是最明显的实现方式,但是当您要查询子项时,它会变得复杂。

一个更好的解决方案是使用嵌套集,它在插入/删除时增加了一些复杂性,但通过非常简单的查询得到了回报。

您可以进行研究来实现这一点,但与 Rails 中的很多东西一样,这是一个已解决的问题。使用awesome_nested_set它将为您处理所有这些。

安装 gem 后,创建此迁移:

def up
  add_column :categories, :lft, :integer
  add_column :categories, :rgt, :integer

  Category.reset_column_information!
  Category.rebuild!
end

def down
  remove_column :categories, :lft
  remove_column :categories, :rgt
end

然后将此行添加到您的模型中:

class Category < ActiveRecord::Base
  acts_as_nested_set

  # ...
end

您可以使用这样的查询来获取所有文章:

category = Category.find(1) # Or any category id

category.self_and_descendants.articles
于 2012-08-03T03:13:39.433 回答