Попытка сопоставить продукты и запросы через категории - PullRequest
0 голосов
/ 29 апреля 2019

Я создаю приложение на рынке рельсов для универмага, в котором пользователи могут сопоставлять конкретные продукты по их запросу.

Пользователи могут перечислять продукты, имеющие определенные категории.

Пользователи также могутlist Запросы, где они могут указать, какие продукты они ищут и их категории.

Цель состоит в том, чтобы сопоставить запрос с конкретным продуктом на основе соответствующих категорий

Вот мои модели

class Product < ApplicationRecord
  belongs_to :user
  has_many_attached :images, dependent: :destroy
  has_many :product_categories
  has_many :categories, through: :product_categories
  validates :user_id, presence: true
end

class Category < ApplicationRecord
  has_many :product_categories
  has_many :products, through: :product_categories
  validates :name, presence: true, length: { minimum: 3, maximum: 25}
  validates_uniqueness_of :name
end

class ProductCategory < ApplicationRecord
  belongs_to :product
  belongs_to :category
end

class Request < ApplicationRecord
  belongs_to :user
  has_many_attached :images, dependent: :destroy
  has_many :request_categories
  has_many :categories, through: :request_categories
  validates :user_id, presence: true
end

class RequestCategory < ApplicationRecord
  belongs_to :request
  belongs_to :category
end

Я думал о создании новой модели под названием Match, чтобы объединить продукт и категории, или проще сопоставить ее в запросе?

1 Ответ

0 голосов
/ 29 апреля 2019

По-моему, ваш новый класс 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...