"... как писать код?", - это тоже надо было дописать в конец вашего текста.
Ну а вообще, если серьезно, то в таблицу
categories добавляете поле
parent_id. По умолчанию равно нулю (нет родительской категории). Думаю, тут все понятно.
Ну а дальше
has_many в модель
Category и
belongs_to в
Product. Про них (с примерами) вы можете почитать тут:
guides.rubyonrails.org/association_basics.html
И вообще...
Как отображать все это во вьюхах?
Ну это вообще зашквар какой-то. Вам про циклы рассказывать или что?
Также будет полезно:
guides.rubyonrails.org/active_record_querying.html