3

雖然工作on 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值是Rails的3 Reservation::GuestReservation::Event但在梁2節省無命名空間即GuestEvent

它需要大量的努力來遷移現有的數據,並改變所有預期沒有命名空間的地方。

是否有可能保存type沒有命名空間和休息的工作,而無需在應用程序中進行大量修改?

+0

你有沒有嘗試別名的類別。像這樣的東西。 'Guest = Reservation :: Guest',我不認爲它最好在運行時改變類型,因爲可能有很多依賴的東西。 – 2014-11-10 13:25:10

+0

@AbibullahRahamathulah許多事情都被別名打斷。所以這不是解決方案。 – 2014-11-11 04:57:17

+0

@AmitPatel是你需要的嗎? – mohameddiaa27 2014-11-12 23:21:21

回答

17

看看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 
7

我知道這是一個老問題,但也許有人會使用它。

擴展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