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

Ami*_*tel 6 migration legacy-code single-table-inheritance ruby-on-rails-3 ruby-on-rails-2

在处理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
Run Code Online (Sandbox Code Playgroud)

在保存Reservation::GuestReservation::Event实例时,type保存的值是Reservation::GuestReservation::EventRails 3中的.但是在Rails 2中,它保存没有名称空间即,GuestEvent.

它需要付出很多努力来迁移现有数据并更改所有type不需要命名空间的地方.

如果type不在命名空间中进行大量修改,是否可以在没有命名空间和休息的情况下进行保存?

moh*_*a27 22

看看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
Run Code Online (Sandbox Code Playgroud)


Ext*_*tor 12

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

扩展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
Run Code Online (Sandbox Code Playgroud)