0

我有一个category模型,基本上就是products分配给它的模型。

所以我的category模型看起来像这样:

attr_accessible :name
has_many :category_products do
  def with_products
    includes(:product)
  end
end

has_many :products, :through => :category_products

我想做的是在类别中包含类别 - 因此应该能够放入产品Men然后Shoes

这样,我可以有一个Men下拉菜单,它会生成Menlike中的所有子类别Shoes

但是,如果用户点击,Men他们将看到该类别中的所有产品。

想法?

4

2 回答 2

2

您可以使用Ancestry 之类的 gem将您的类别组织成层次结构。

如果您只需要一层深度的嵌套,则可以使用自联接。

belongs_to :parent_category, class: "Category"
has_many :subcategories, class: "Category"

您还需要迁移才能添加category_id到您的category表中。

app/views/categories/_form.html.erb在您的for中粘贴一个下拉列表,category_id并用您的类别列表填充它。您可以使用它为您的类别选择“父级”。

然后你可以做类似的事情:

# Get parent category's name
<%= somecategory.parent.name %>

# Iterate through subcategories
<% someothercategory.subcategories.each do |category| %>
  <%= category.name %>
<% end %>

不过,在使用这些类别及其关联时,使用 Ancestry 之类的 gem 将为您提供更多的灵活性。

关于祖先如何工作的一点:

Ancestry 为每个节点存储从根到父节点的路径。这是物化路径数据库模式的一种变体。它允许 Ancestry 在单个 SQL 查询中获取任何关系(兄弟姐妹、后代等),而无需复杂的算法和与左右值相关的不可理解性。此外,任何插入、删除和更新只会影响受影响节点自己的子树中的节点。

于 2012-12-21T01:42:03.627 回答
0

我不知道 Ancestry gem 是如何工作的,但在嵌套解决方案中,主要关注的是 - 速度。如果模型类别不受高频创建的影响,请尝试awesome_nested_set。它不仅使用 parent_id,而且使用 :lft 和 :rgt 列,当孩子非常非常多时,它们可以显着加快相互嵌套对象的搜索速度...... 30-50 个类别和数千种产品 - 就是这种情况之一。

于 2012-12-21T02:09:37.307 回答