Это то, что я сделал в одном из моих проектов, который прямо сейчас работает и работает очень хорошо.
Сначала модель категории, она имеет атрибут имени, и я использую драгоценный камень 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
Спасибо так много! Я начну внедрять и держать вас в курсе. Вопрос. Разве модель категории не должна иметь «много: категоричность? – Liroy
Правильно! Я пропустил эту часть. Отредактировал ответ :) –
awesome :) У категориальной модели тоже есть таблица? – Liroy