class SimilarProductRelation < ApplicationRecord
belongs_to :product
belongs_to :similar_product, class_name: "Product"
end
class Product < ApplicationRecord
# self being the "origin"
has_many :similar_products_relations, source: :product_id, class_name: "SimilarProductRelation"
has_many :similar_products, class_name: "Product", through: :similar_products_relations
# self being the "destination"
has_many :similar_products_relations_as, source: :similar_product_id, class_name: "SimilarProductRelation"
has_many :similar_products_as, class_name: "Product", through: :similar_products_relations
end
# migration
create_table :similar_product_relations do |t|
t.references :product, foreign_key: true, null: false, index: true
t.references :similar_product, foreign_key: { to_table: :products }, null: false, index: true
end
Индекс истина или нет в зависимости от того, в каком направлении вы собираетесь делать запросы, и вы можете оставить только одно направление в ассоциации, в классе Product
, если вы собираетесь использовать только одно.