0

Ich versuche ein STI-Muster in meiner Rails-Anwendung zu implementieren und ich werde verrückt.Rails 4.2 STI // Falsches Casting (Superklasse statt Subclass)

Ich habe drei Modelle:

Superklasse:

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

    #some code here 
end 

Subklassen:

class ApartmentReservation < Reservation 
    #some code here 
end 

class StorageReservation < Reservation 
    #some code here 
end 

ich eine Subklassen-Instanz erhalten möchten, rufen Superklasse, zum Beispiel

Reservation.all sollte eine Sammlung von ApartmentReservation und StorageReservation zurückgeben, aber es wird eine Sammlung von Reservierung zurückgegeben.

Ich habe nach einer Antwort gesucht und ich fand heraus, dass es wegen einer eifrigen Last in einer Entwicklungsumgebung ist. Im Anschluss an die Ratschläge, ich habe mit diesen Teilen des Codes versucht:

In initializers:

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

In Superklasse:

def self.descendants 
    [ApartmentReservation, StorageReservation] 
end 

Im unteren Teil des Oberklasse:

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

Aber es funktioniert immer noch nicht.

Hat jemand eine Idee, wie man es funktioniert?

Dies betrifft rails server, jedoch in rails console alles funktioniert gut.

Antwort

0

Ich habe die Ursache des Problems gefunden. Ich hatte zwei Klassenmethoden in Superklasse und sie beeinflussten ein STI-Verhalten. Nach dem Entfernen/Verschieben dieser Methoden funktioniert das Casting einwandfrei. Hat jemand eine Idee, warum?

Diese Methoden:

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

Was diese Methoden waren? –

+0

@SergioTulentsev Die erste Methode hat ein Array von Status zurückgegeben, die zweite ein Array von Attributen (es wurde die columns_hash-Methode von ActiveRecord verwendet). –

+0

Es war ein Hinweis, diese Methoden in die Antwort (oder zumindest ihre Signaturen) zu setzen. –