По-моему, ваш новый класс Match
по сути будет таблицей соединений для ассоциации has_many :through
.Предполагая, что вы реализуете асинхронный рабочий (например, Sidekiq / ActiveJob) для прохождения и создания «совпадений», вы захотите связать совпадения с конкретным Request
и, вероятно, сохраните некоторые метаданные (видел ли пользовательMatch
еще? Они отвергли это?)
Итак, я бы, вероятно, сгенерировал класс Match
следующим образом:
rails g model Match seen_at:datetime deleted_at:datetime request:references product:references
И настроил ассоциации следующим образом:
class Match < ApplicationRecord
belongs_to :request
belongs_to :product
end
class Request < ApplicationRecord
belongs_to :user
has_many_attached :images, dependent: :destroy
has_many :request_categories
has_many :categories, through: :request_categories
has_many :matches
has_many :products, through: :matches
validates :user_id, presence: true
end
class Product < ApplicationRecord
belongs_to :user
has_many_attached :images, dependent: :destroy
has_many :product_categories
has_many :categories, through: :product_categories
has_many :matches
has_many :requests, through: :matches
validates :user_id, presence: true
end
Кроме того, вы, вероятно, захотите добавить Request
has_many: through к вашей Category
модели (кажется, вы ее забыли):
class Category < ApplicationRecord
has_many :product_categories
has_many :products, through: :product_categories
has_many :request_categories
has_many :requests, through: :request_categories
validates :name, presence: true, length: { minimum: 3, maximum: 25}
validates_uniqueness_of :name
end
Большая часть работы заключается в том, чтобы приложение периодически просматривало совпадения - возможно, вы захотите начать с документации Active Job Basics .