0

我試圖在我的Rails應用程序中實現STI模式,並且我將變得瘋狂。Rails 4.2 STI //錯誤的投射(超類而不是子類)

我有三個型號:

超類:

class Reservation < ActiveRecord::Base 
    self.inheritance_column = :inheritance_type 

    #some code here 
end 

子類:

class ApartmentReservation < Reservation 
    #some code here 
end 

class StorageReservation < Reservation 
    #some code here 
end 

我希望得到一個子類的實例,調用父類,例如

Reservation.all應該返回一個ApartmentReservation和StorageReservation的集合,但它返回一個Reservation的集合。

我一直在尋找答案,我發現這是因爲開發環境中的熱切負載。繼建議,我一直在試圖與這些代碼部分:

在初始化:

Rails.configuration.to_prepare do 
    require_dependency 'app/models/apartment_reservation' 
    require_dependency 'app/models/storage_reservation' 
end 

在超類:

def self.descendants 
    [ApartmentReservation, StorageReservation] 
end 

在超類的底部:

require_dependency 'app/models/apartment_reservation' 
require_dependency 'app/models/storage_reservation' 

但它仍然無法正常工作。

有沒有人有任何想法,如何使其工作?

這涉及rails server,但在rails console一切工作正常。

回答

0

我發現問題的根源。我在超類中有兩個類方法,它們影響STI行爲。在移除/移動這些方法後,鑄造工作正常。有沒有人有任何想法,爲什麼?

這些方法:

def self.date_attributes 
    self.columns_hash 
     .keep_if{ |k, v| [:date, :datetime].include? v.type } 
     .collect{ |k, v| k } 
end 

def self.sms_statuses 
    { 
     sms_limit_reached: I18n.t('sms.reservation.sms_limit_reached'), 
     invalid_number: I18n.t('sms.reservation.invalid_number'), 
     ok: I18n.t('sms.reservation.ok') 
    } 
end 
+0

什麼是那些方法呢? –

+0

@SergioTulentsev第一個方法返回一個狀態數組,第二個屬性數組(它使用ActiveRecord的columns_hash方法)。 –

+0

這是暗示將這些方法放在答案中(或者至少是他們的簽名)。 –