Hoc*_*ock 1 ruby-on-rails has-many-through
我有一个类别,一个子类别和一个产品模型.
我有:
Category has_many Subcategories
Subcategory has_many Products
Subcategory belongs_to Category
Product belongs_to Subcategory
Run Code Online (Sandbox Code Playgroud)
有没有办法有类似的东西
Category has_many Projects through Subcategories
Run Code Online (Sandbox Code Playgroud)
?
"普通"轨道方式不起作用,因为"子类别"不属于产品,因此产品没有子类别_id字段.相反,我需要查询类似的东西
SELECT * FROM products WHERE id IN category.subcategory_ids
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
谢谢,
NicolásHockIsaza
如果你使用'正常'的Ruby on Rails方式,你描述的数据库看起来就像这样.如果您的数据库不是这样构建的,我建议您阅读更多关于如何在Ruby on Rails中完成关联的内容,因为这是正确的方法(并且您应该t.references :category在迁移中使用它,因为它的设计目的是为了不容易弄乱你的参考文献).
+----------------+ +----------------+ +----------------+
| categories | | subcategories | | products |
+----------------+ +----------------+ +----------------+
| id | | id | | id |
| ... | | category_id | | subcategory_id |
| | | ... | | ... |
+----------------+ +----------------+ +----------------+
Run Code Online (Sandbox Code Playgroud)
以此作为您的数据库结构,has_many :products, :through => subcategories适用于Category模型.
class Category < ActiveRecord::Base
has_many :subcategories
has_many :products, :through => :subcategories
end
Run Code Online (Sandbox Code Playgroud)
Subcategory.rb
class Subcategory < ActiveRecord::Base
belongs_to :category
has_many :products
end
Run Code Online (Sandbox Code Playgroud)
Product.rb
class Product < ActiveRecord::Base
belongs_to :subcategory
has_one :category, :through => :subcategory # don't need this, but it does work
end
Run Code Online (Sandbox Code Playgroud)
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, ...>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
921 次 |
| 最近记录: |