2015-09-24 2 views
-1

Итак, я пытаюсь создать систему категоризации продуктов в моем приложении 4 rails.Лучший способ классифицировать продукты в 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)

Спасибо!

ответ

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 модель, которая является связующим звеном между любым субъектом (продукты), которое categorizable и category. Обратите внимание, что 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 

Теперь мы просто включают в себя это в модели, чтобы сделать ее категоризированной.

Использование было бы что-то вроде этого

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 
+1

Спасибо так много! Я начну внедрять и держать вас в курсе. Вопрос. Разве модель категории не должна иметь «много: категоричность? – Liroy

+0

Правильно! Я пропустил эту часть. Отредактировал ответ :) –

+0

awesome :) У категориальной модели тоже есть таблица? – Liroy