2015-04-15 11 views
2

我有,我想放到一个单一lookups表,而不必单独20+表,每一个具有相同属性的几个项目:轨道4:单表继承和不使用类名作为“类型”

  • 国家
  • 状态
  • email_types
  • phone_types
  • address_types
  • 等...

在Rails中,我只是将type列添加到lookups表中,它“神奇地”起作用。

不过,我已经命名空间为一些开发商的易于使用的车型,因为它变得有点混乱:

# app/models/lookup.rb 
class Lookup < ActiveRecord::Base 
end 

# app/models/lookups/country.rb 
class Lookups::Country < Lookup 
end 

所以,当我Lookups::Country.create(name: "Italy"),它存储"Lookups::Country"type

但所有优秀的开发人员,我最终会做一些重构,和而不是扔进一个app/models/lookups命名空间中的所有查询,我要打破他们到他们的各种元素:

# app/models/addresses/country.rb 
class Addressess::Country < Lookup 
end 

的改变命名空间的唯一原因是随着它越来越大,重新组织项目。

因此,当我Addressess::Country.create(name: "Italy")现在,它存储type"Addressess:Country"。现在问题是在lookups表中有2个“类型”的国家。

基本上,我只是“丢失”了我的数据,因为我将模型移动到了不同的命名空间。我将不得不去更新所有"Lookups::Country"记录以获得"Addressess::Country"类型的记录。

有什么办法可以避免这种情况?我会频繁地移动模型,直到它们被成熟地组织起来,并且每次移动文件以使开发人员的生活变得更简单时,都不会需要进行数据库更新/迁移。

回答

0

覆盖每个模型的sti_name类方法可能有效。

试试这个 -

# app/models/addresses/country.rb 
class Addressess::Country < Lookup 
    def self.sti_name 
     "Address" 
    end 
end