在处理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::Guest
或Reservation::Event
实例时,正在保存的type
值在{3}}和{3}}在Rails 3中。但在Rails 2中,它保存为名称空间,即Reservation::Guest
或Reservation::Event
。
迁移现有数据并更改所有需要Guest
而没有命名空间的地方需要付出很多努力。
是否可以在没有命名空间的情况下保存Event
并且无需在整个应用程序中进行大量修改即可休息?
答案 0 :(得分:21)
查看sti_name
和find_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