Чтобы смоделировать отношения, которые вы описали, вы должны сделать:
models/category.rb
class Category < ActiveRecord::Base
has_many :products
has_many :subcategories, :class_name => "Category", :foreign_key => :parent_id
end
models/product.rb
class Product < ActiveRecord::Base
belongs_to :product
has_many :features, :through => :product_features
has_many :product_features
end
models/feature.rb
class Feature < ActiveRecord::Base
has_many :product_features
has_many :products, :through => :product_features
end
models/productfeature.rb
class ProductFeature < ActiveRecord::Base
belongs_to :product
belongs_to :feature
end
Учитывая эту структуру, у вас есть соединение, смоделированное как отношение «многие ко многим». Это полезно, так как стиль соединения HABTM в Rails 3.1
исчезает
Чтобы получить информацию, я часто использую консоль rails console для тестирования, и это позволит вам сделать
@category = Category.first #get the first category
@category.subcategories #returns an array of categories
Обход ссылок осуществляется через отношения, которые вы устанавливаете в моделях, с намерением, чтобы его можно было прочитать , в контексте использования разумных имен. Самостоятельные соединения, согласно вашему вопросу, также описаны в Rails Guides: Ассоциации с хорошим примером. В остальной части этого руководства также подробно описываются другие отношения.
Еще одна вещь, которую нужно помнить, - это создать ваши миграции, чтобы таблица соединений создавалась с идентификаторами, которые являются внешними ключами.