在Rails模型和ActiveRecord中进行子类化

age*_*eto 2 inheritance ruby-on-rails

我正在编写一个电子商务类型的网络应用程序(不完全是,但给你一个想法).我将展示与彼此关系不大的不同类型的产品,但我希望有一个Product父类,为所有子类提供一个公共视图,并共享一些字段和行为.

但是这给我提出了许多问题,特别是关于ActiveModel:产品不应该有自己的表,但我希望它的子类(酒店,餐馆等)中的某些字段可以从中继承这些字段.我该怎么办呢?

拥有Product父类的另一个原因是最终我将需要使用Product.all和类对象的不同范围.

也许我完全被误导了,所以请随意建议任何方式来做到这一点.也许使用模块?

Can*_*ide 6

首先,继承意味着字段是继承的; 因此,您不仅可以获得一些字段,而且还可以获得子类中父类的所有字段.

您可以通过多种方式实现您想要的目标:

  • 创建一个模块并将所有共享方法放入其中,并将其包含在每个模型中
  • 使用set_table_name在子类路由模型中使用另一个表.如果您有多个表与表共享相同的字段,这将非常有用product.
  • 如果您的模型共享同一个表,但是通过诸如product_type您可以default_scope用来始终应用诸如的条件之类的属性进行区分default_scope where(:product_type => :hotel)

使用API作为使用上述方法的参考.