尝试通过类别匹配产品和请求

时间:2019-04-29 04:15:58

标签: ruby-on-rails ruby-on-rails-5

我正在为uni开发一个Rails市场应用程序,可以根据用户的要求将用户与特定产品匹配。

用户可以列出具有特定类别的产品。

用户还可以列出请求,在其中可以指定他们要查找的产品及其类别。

目的是根据匹配类别将请求匹配到特定产品

这是我的模特

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 :(得分:0)

在我看来,新的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文档开始。