如何正确设置这些ActiveRecord关系?

时间:2011-08-04 01:59:12

标签: ruby-on-rails database activerecord associations relational-database

我在理解如何正确设置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

但我也希望树允许ProductProductItem(即没有子类型),例如:

Product 
-> ProductItem

如何设置这些以达到这些要求?谢谢!

1 个答案:

答案 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

如果这不是您想要的,那么如果您提供更清晰的话,我会很乐意改变我的答案。