Возможно, я неправильно понимаю.Но, мне кажется ...
Вы можете использовать enum
, чтобы указать, к какой категории относится каждая запись Category
.Что-то вроде:
# == Schema Information
#
# Table name: categories
#
# id :integer not null, primary key
# name :string not null
# categorizes :integer not null
# created_at :datetime not null
# updated_at :datetime not null
#
class Category < ApplicationRecord
has_many :categorizations
has_many :categorizeables, through: :categorizations
enum categorizes: {
post: 0,
product: 1,
article: 2,
location: 3
}
class << self
def not_for(categorizeable_type)
where.not(categorizes: categorizeable_type)
end
end
end
Затем вы можете использовать свою модель полиморфного соединения, Categorization
Что-то вроде:
# == Schema Information
#
# Table name: categorizations
#
# id :integer not null, primary key
# category_id :integer not null
# categorizeable_id :integer not null
# categorizeable_type :string not null
# created_at :datetime not null
# updated_at :datetime not null
#
class Categorization < ApplicationRecord
belongs_to :category
belongs_to :categorizeable, polymorphic: true
end
И затем вы можете связать свои categorizations
и categories
используя has :many, through
:
# == Schema Information
#
# Table name: posts
#
# id :integer not null, primary key
# created_at :datetime not null
# updated_at :datetime not null
#
class Post < ApplicationRecord
has_many :categorizations, as: :categorizeable
has_many :categories, through: :categorizations
validate :correct_categorization
def correct_categorization
if categories.not_for(:post).any?
errors.add(:categorization, "is incorrect")
end
end
end
Я добавил эту проверку, так как вы заявили, что «категории являются совершенно отдельными для каждого класса».Возможно, вам придется немного повозиться с этим, но, надеюсь, это даст вам представление о том, как это может работать.