Rails 4:单表继承,不将类名用作“类型”

问题描述 投票:2回答:2

我想将几个项目合并到一个lookups表中,而不要拥有20多个单独的表,每个表都具有相同的属性:

  • 国家
  • 电子邮件类型
  • phone_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")时,它存储的type"Lookups::Country"

但是作为所有优秀的开发人员,我最终要进行一些重构,而不是将所有查找都扔到单个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"的类型。

有什么办法可以避免这种情况?我将经常移动模型,直到它们成熟为止,并且每次我移动文件来简化开发人员的工作时,我都负担不起必须进行数据库更新/迁移。

ruby-on-rails-4 namespaces data-migration sti
2个回答
0
投票

为每个模型覆盖sti_name类方法可能有用。

尝试一下-

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

0
投票

这对我有用:https://gist.github.com/vamdt/75aca125883a88a9f1fd(请参见代码)

© www.soinside.com 2019 - 2024. All rights reserved.