单表继承和命名空间类的'type'值

时间:2014-11-03 07:33:51

标签: ruby-on-rails-3 migration ruby-on-rails-2 single-table-inheritance legacy-code

在处理Rails 2.3.18到Rails 3.2.x迁移时我在type列中面临名称问题

这是定义的关系。

app/models/reservation.rb

class Reservation
end

class Reservation::Guest < Reservation
end

class Reservation::Event < Reservation
end

在保存Reservation::GuestReservation::Event实例时,正在保存的type值在{3}}和{3}}在Rails 3中。但在Rails 2中,它保存为名称空间,即Reservation::GuestReservation::Event

迁移现有数据并更改所有需要Guest而没有命名空间的地方需要付出很多努力。

是否可以在没有命名空间的情况下保存Event并且无需在整个应用程序中进行大量修改即可休息?

2 个答案:

答案 0 :(得分:21)

查看sti_namefind_sti_class。 (负责设置和获取sti_name的方法)


您可以按如下方式自定义它们:

class Reservation
  def self.find_sti_class(type_name)
    type_name = self.name
    super
  end
end

class Reservation::Guest < Reservation
  def self.sti_name
    "Guest"
  end
end

class Reservation::Event < Reservation
  def self.sti_name
    "Event"
  end
end

答案 1 :(得分:10)

我知道这是一个老问题,但也许有人会使用它。

扩展mohameddiaa27的答案,摆脱命名空间的最简单方法是声明store_full_sti_class,因为sti_name使用了它。

class Reservation

  # don't include namespace in type column
  def self.store_full_sti_class
    false
  end
end