在rails应用程序中处理类别的好方法是什么?

时间:2011-06-28 10:02:31

标签: ruby-on-rails e-commerce associations categories

我正试图了解如何处理我的产品< - >类别关系。 我正在尝试在rails中建立一个小商店,我想从类别树中进行导航。

导航将如下所示:

- Men
|--Shirts
|--Pants
- Woman
|--Shirts
|--Dresses
-Accessoires

你明白了......

现在,问题是这些似乎是同一型号Product上的所有不同范围,在相关类别上具有不同的查找条件。

到目前为止我的模特:

class Product < ActiveRecord::Base
    # validations...
    has_many :categorizations
    has_many :categories, :through => :categorizations
    # more stuff ...
end

class Category < ActiveRecord::Base
    acts_as_nested_set
    has_many :categorizations
    has_many :products, :through => :categorizations  
end

class Categorization < ActiveRecord::Base
  belongs_to :product
  belongs_to :category
end

此外,我希望在我的产品上有多个类别,并且可以在添加产品时“即时”创建新类别。所以整个类别管理应该尽可能简单。如果有人可以指出我正确的方向或链接我的教程,最佳做法或任何事情真的很棒!

更新

好的,现在我可以使用virtual attributes动态创建类别,问题是如何搜索特定类别的文章?

我尝试了什么:

@products = Product.scoped(:include => :categorizations, :conditions => {:category_names => params[:category]})

   @products = Product.where("categorization = ?", params[:category])

但两者都没有用。基本上我想要一个类别的所有产品...

2 个答案:

答案 0 :(得分:0)

您可以允许用户在模型中使用accepts_nested_attributes_for创建新产品的同时创建新类别。请查看相关文档,以便开始使用。

答案 1 :(得分:0)

所以我最终通过分类创建了多对多关系。这个railscast完美地解释了如何执行此操作并即时创建新类别(或标签)。

在我遍历各个类别后,在我的产品概述中进行链接:

# app/views/products/index.html.erb 
<ul class="categories">
    <% for category in @categories %>
       <li><%= link_to category.name, :action => "index" , :category => category.id %></li>
    <% end %>
    </ul>

然后在控制器中我构建了类别中的产品,如果有的话:

# products_controller.rb
  def index
    if params[:category]
      @products = Category.find(params[:category]).products
    else
      @products = Product.scoped
    end
    @products = @products.where("title like ?", "%" + params[:title] + "%") if params[:title]
    @products = @products.order('title').page(params[:page]).per( params[:per_page] ? params[:per_page] : 25)
    @categories = Category.all
  end

可以肯定的是,有一种更优雅的方式可以做到这一点,但现在这种情况很糟糕。任何改善都会受到赞赏。