我在理解如何正确设置ActiveRecord关系以解决以下问题时遇到问题......
现在我有了这个产品树:
Product
-> ProductTypes
-> Subtypes
-> Subtypes
-> ...
-> Subtypes
-> ProductItem
产品是:
class Product < ActiveRecord::Base
has_many :product_types
has_one :product_item, :foreign_key => "product_id"
end
ProductType和Subtype是:
class ProductType < ActiveRecord::Base
belongs_to :product
belongs_to :parent_type, :class_name => "ProductType"
has_many :subtypes, :class_name => "ProductType", :foreign_key => "parent_type_id"
has_one :product_item
end
和ProductItem是:
class ProductItem < ActiveRecord::Base
belongs_to :product_type
belongs_to :product
end
但我也希望树允许Product
仅ProductItem
(即没有子类型),例如:
Product
-> ProductItem
如何设置这些以达到这些要求?谢谢!
答案 0 :(得分:0)
这取决于ProductType是什么。如果是分类,那么拥有has_many:product_types的关联可能是有意义的。如果您真正想要的是实际不同类型的产品,那么我会使用STI让您的生活更简单一些。另外,我会将product_item简化为item,除非您有充分的理由。
http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/
STI Way 将迁移添加到Products表以添加类型列:
add_column :products, :type, :string
然后将模型更改为如下所示:
product.rb
class Product < ActiveRecord::Base
has_one :item
end
type_1.rb
class Type1 < Product
end
type_2.rb
class Type2 < Product
end
等
对于你的子类型,我会做同样的事情(以type1为例):
subtype_1.rb
class Subtype1 < Type1
end
所以现在所有不同的类型和子类型都有一个与之关联的项目。您的商品现在只与产品相关联,您就完成了。
item.rb的
class Item < ActiveRecord::Base
belongs_to :product
end
如果这不是您想要的,那么如果您提供更清晰的话,我会很乐意改变我的答案。