2017-06-06 15 views
0

The documentation継承の場合、type列の値を選択できるので、STIを簡単に実装する方法が説明されています。単一テーブル継承のサブクラスマッピングの指定

しかし、私にはレガシーDBがあり、これらの値はすでに存在しています。 PRIORITYECONOMY、およびFLEXIとし、これらの値をサブクラスにマップする方法を指定するにはどうすればよいですか?

class PriorityPassenger < Passenger 
    # map to PRIORITY 
end 
+0

@SergioTulentsev 1は、猿のパッチと一緒に行くことを決定した場合、[この男](https://github.com/rails/rails/blob/ 86be4bfe37f8adc576b6895093656b63c2438d30/activerecord/lib/active_record/inheritance.rb#L186)の方が優れています。また、 'Prepend MyMonkey'は、再オープンされたクラスの直接的なMonkeypatchingよりも優れています。 – mudasobwa

+0

@ mudasobwa:はい、その方法が良い選択と思われます。 –

答えて

1

これが(未テスト)動作するはずです:

ActiveRecord::Inheritance::ClassMethods.prepend(Module.new do 
    def find_sti_class(type_name) 
    case type_name 
    when 'PRIORITY' then PriorityPassenger 
    ... 
    else super(type_name) 
    end 
    end 
end) 
+0

愚かな質問:このコードはどこに行きますか? Passengerクラスでは、独立したファイルですか? – garci560

+0

いくつかの '初期化子'では、早ければ早いほどいいです。 – mudasobwa

+0

私はこのコードを 'config/initializers'の下に新しいファイルに入れました。これで' PriorityPassenger'の '未定義メソッド' attributes_builder 'が得られます:String' – garci560

関連する問題