0

레일 애플리케이션에서 STI 패턴을 구현하려고하는데 미쳐 버릴 것입니다. 예를 들어, 슈퍼 클래스를 호출, 나는 서브 클래스의 인스턴스를 얻으려면레일 4.2 STI // 잘못된 캐스팅 (서브 클래스 대신 슈퍼 클래스)

class ApartmentReservation < Reservation 
    #some code here 
end 

class StorageReservation < Reservation 
    #some code here 
end 

:

슈퍼 클래스 :

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

    #some code here 
end 

서브

나는 세 가지 모델이

Reservation.all은 ApartmentReservation 및 StorageReservation의 컬렉션을 반환해야하지만 Reservation 컬렉션을 반환해야합니다.

나는 대답을 찾고 있었고 개발 환경에서 열심히로드되어 있기 때문에 발견했습니다. 초기화에서

:

require_dependency 'app/models/apartment_reservation' 
require_dependency 'app/models/storage_reservation' 
: 수퍼 클래스의 바닥에서

def self.descendants 
    [ApartmentReservation, StorageReservation] 
end 

:

슈퍼 클래스에서
Rails.configuration.to_prepare do 
    require_dependency 'app/models/apartment_reservation' 
    require_dependency 'app/models/storage_reservation' 
end 

충고에 따라, 나는 이러한 코드 부분과 시도를하고 있어요

하지만 여전히 작동하지 않습니다.

아무도 아이디어가 있습니까, 어떻게 작동 시키는가?

이것은 rails server에 해당하지만, rails console에는 모든 것이 올바르게 적용됩니다.

답변

0

문제점의 원인을 발견했습니다. Superclass에는 두 가지 클래스 메소드가 있었고 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

그 방법을 답안 (또는 그들의 서명)에 넣는 것이 힌트였습니다. –