Если вы сделаете это «обычным» способом Ruby on Rails, описанная вами база данных будет выглядеть примерно так. Если ваша база данных не имеет такой структуры, я предлагаю прочитать больше о том, как выполняются ассоциации в Ruby on Rails, потому что это правильный путь (и вы должны использовать t.references :category
в своей миграции, так как она была разработана, чтобы упростить ее. чтобы не испортить ваши ссылки).
+----------------+ +----------------+ +----------------+
| categories | | subcategories | | products |
+----------------+ +----------------+ +----------------+
| id | | id | | id |
| ... | | category_id | | subcategory_id |
| | | ... | | ... |
+----------------+ +----------------+ +----------------+
С этой структурой базы данных has_many :products, :through => subcategories
работает для модели Category
.
Category.rb
class Category < ActiveRecord::Base
has_many :subcategories
has_many :products, :through => :subcategories
end
Subcategory.rb
class Subcategory < ActiveRecord::Base
belongs_to :category
has_many :products
end
Product.rb
class Product < ActiveRecord::Base
belongs_to :subcategory
has_one :category, :through => :subcategory # don't need this, but it does work
end
скрипт ruby \ console
>> c = Category.create
=> #<Category id: 1, ...>
>> c.subcategories.create
=> #<Subcategory id: 1, category_id: 1, ...>
>> p = s.products.create
=> #<Product id: 1, subcategory_id: 1, ...>
>> c.products
=> [#<Product id: 1, subcategory_id: 1, ...>]
>> p.category # if you have the has_one assocation
=> #<Category id: 1, ...>