2010-05-17 65 views
1

我有一个类别,一个子类别和一个产品模型。单向有很多通过

我:

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 

有没有办法做到这一点?

感谢,

尼古拉斯福伊萨萨

+0

类别和子类别作为单独的模型做了一个奇怪的看树。每个对象只有一个级别,还是子类别对象可以嵌套在一起? – jdl 2010-05-17 04:39:01

+0

我想只会有一个级别。 – Hock 2010-05-17 04:40:39

+1

我认为你的大部分困惑都来自于你认为XXX_id字段在你名为belongs_to的模型上,但事实并非如此。说belongs_to的模型有参考字段。 – Samuel 2010-05-17 04:48:20

回答

5

如果你这样做“正常” 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脚本\控制台
>> 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, ...> 
+0

好的。我有这个确切的事情(没有has_one),它没有工作。我想这应该是一个错字,因为我一看到你的答案就立刻写下所有的东西,现在它正在工作。谢谢 :-) – Hock 2010-05-17 05:02:46