Coś a'la product has_and_belongs_to_many products

Mam model Product.
Produkt może być podstawowy i opcjonalny. Produkt opcjonalny “zależy” od produktu podstawowego. Czyli coś w s tylu, że jak dodam produkt A do koszyka, to wtedy mogę dodać B i C, ale już jak dodam produkt D to B i C są niedostępne.

Przykładowo:
Produkty: Basic TV, HD TV, Music HD. Produkt Music HD można sobie “dobrać” mając wybrany HD TV, ale jak się wybierze Basic TV to nie ma takiej możliwości.

No centralnie coś jak
class Product < ApplicationRecord
has_and_belongs_to_many :products, join_table: :optional_products

OptionalProduct
primaryproduct_id
optional_roduct_id

W jaki sposób zrobić to “elegancko” ?

PS. Rails 5

Odpowiadam sobie. Tak jak myślałem, tak zrobiłem:

class AddProductConnections < ActiveRecord::Migration[5.0]
  create_table "product_connections", :force => true, :id => false do |t|
    t.integer "primary_product_id", :null => false
    t.integer "optional_product_id", :null => false
  end
end

i w modelu:

  has_and_belongs_to_many(:products,
    :join_table => "product_connections",
    :foreign_key => "primary_product_id",
    :association_foreign_key => "optional_product_id")