0

私はRailsアプリケーションでSTIパターンを実装しようとしていますが、私は夢中になります。例えば、スーパークラスを呼び出して、私はサブクラスのインスタンスを取得したいRails 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のコレクションを返す必要がありますが、予約のコレクションを返します。

私は答えを探していましたが、開発環境の負荷が大きかったことがわかりました。初期化子で

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で2つのクラスメソッドを持っていて、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最初のメソッドは状態の配列を返し、2番目は属性の配列です(ActiveRecordのcolumns_hashメソッドを使用していました)。 –

+0

これらのメソッドを答えに入れるヒント(またはその署名)は最低限必要です。 –

関連する問題