在rails 4 app中对产品进行分类的最佳方式

时间:2015-09-24 12:11:54

标签: ruby-on-rails ruby gem categorization

所以,我正在尝试在我的rails 4 app中创建一个产品分类'系统'。

这是我到目前为止所拥有的:

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

class Product < ActiveRecord::Base
  include ActionView::Helpers

  has_many :categories, through: :categorizations
  has_many :categorizations
end

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

另外,我应该使用什么宝石? (awesome_nested_set,has_ancestry)

谢谢!

1 个答案:

答案 0 :(得分:2)

这就是我在我的一个项目中所做的,它现在正在运行并且运行良好。

首先是类别模型,它有一个名称属性,我使用的是宝石acts_as_tree,因此类别可以有子类别。

class Category < ActiveRecord::Base
  acts_as_tree order: :name
  has_many :categoricals
  validates :name, uniqueness: { case_sensitive: false }, presence: true
end

然后我们将添加名为categorical模型的内容,该模型是categorizablecategory的任何实体(产品)之间的链接。请注意,categorizable是多态的。

class Categorical < ActiveRecord::Base
  belongs_to :category
  belongs_to :categorizable, polymorphic: true

  validates_presence_of :category, :categorizable
end

现在,一旦我们设置了这两个模型,我们就会添加一个可以构建任何实体categorizable的关注点,无论是产品,用户等等。

module Categorizable 
  extend ActiveSupport::Concern

  included do
    has_many :categoricals, as: :categorizable
    has_many :categories, through: :categoricals
  end

  def add_to_category(category)
    self.categoricals.create(category: category)
  end

  def remove_from_category(category)
    self.categoricals.find_by(category: category).maybe.destroy
  end

  module ClassMethods
  end
end

现在我们只是将它包含在模型中以使其可分类。

class Product < ActiveRecord::Base
  include Categorizable
end

用法就是这样的

p = Product.find(1000) # returns a product, Ferrari
c = Category.find_by(name: 'car') # returns the category car

p.add_to_category(c) # associate each other
p.categories # will return all the categories the product belongs to