Один из способов - через много - PullRequest
1 голос
/ 17 мая 2010

У меня есть категория, подкатегория и модель продукта.

У меня есть:

Category has_many Subcategories
Subcategory has_many Products
Subcategory belongs_to Category
Product belongs_to Subcategory

Есть ли способ получить что-то вроде

Category has_many Projects through Subcategories

«Обычный» путь рельсов не будет работать, потому что «подкатегория» не принадлежит продукту, поэтому у продукта нет поля subcategory_id. Вместо этого мне нужно, чтобы запрос был что-то вроде

SELECT * FROM products WHERE id IN category.subcategory_ids

Есть ли способ сделать это?

Спасибо

Николас Хок Исаза

1 Ответ

5 голосов
/ 17 мая 2010

Если вы сделаете это «обычным» способом 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, ...>
...