Ruby on Rails:创建单独的模型后,可能/优先实现单表继承?

时间:2013-04-05 21:33:08

标签: ruby-on-rails refactoring single-table-inheritance

我在我的介绍Ruby on Rails类中构建了一个简单的地址簿应用程序,其中包含使用单个控制器的嵌套表单的街道地址(地址),电子邮件地址(电子邮件)和Web地址(Web)的单独模型(条目)。我现在想更改最后两个模型(电子邮件和Web)以使用基本Url表中的单表继承。与使用正确的继承关系从头重建应用程序相比,这是否更可取(甚至可能)?

我在下面列出了我现有的模型:

class Entry < ActiveRecord::Base
  attr_accessible :first_name, :last_name, :addresses_attributes, :webs_attributes, :emails_attributes
  has_many :addresses, dependent: :destroy
  has_many :emails, dependent: :destroy
  has_many :webs, dependent: :destroy
  accepts_nested_attributes_for :addresses, :emails, :webs, allow_destroy: true, reject_if: :all_blank
end

class Address < ActiveRecord::Base
  belongs_to :entry
  belongs_to :address_type
  attr_accessible :address_type_id, :city, :state, :street, :zip
end

class Email < ActiveRecord::Base
  belongs_to :entry
  belongs_to :address_type
  attr_accessible :address_type_id, :email, :entry_id
  validates_email_format_of :email
end

class Web < ActiveRecord::Base
  belongs_to :entry
  belongs_to :address_type
  attr_accessible :address_type_id, :web, :entry_id
end

如何改变

class Email < ActiveRecord::Base

class Web < ActiveRecord::Base

class Email < Url

class Web < Url

影响我现有的申请?

提前感谢您的帮助和建议。

2 个答案:

答案 0 :(得分:1)

请务必添加继承Url类的ActiveRecord::Base类。

class Url < ActiveRecord::Base
  belongs_to :entry
  belongs_to :address_type
  attr_accessible :address_type_id :entry_id
end

class Email < Url
  attr_accessible :email
  validates_email_format_of :email
end

class Web < Url
  attr_accessible :web
end

还要在entry.rb添加额外的行:

  has_many :urls, dependent: :destroy

答案 1 :(得分:0)

可以生成设置单表继承的迁移,但遗憾的是,如果不破坏我的应用程序中的其他内容,我无法成功执行此操作。我继续使用新的应用程序重新启动并正确实现了正确的继承。这符合时间和从头开始构建应用程序的做法。在现实环境中,我确信值得花时间来创建适当的迁移并更改各种依赖项。

感谢Zippie的建议。我很感激。