2011-01-07 8 views
1

生データを取得する必要があるレガシーデータベースが多数あります。データベース内の各テーブルには、任意の名前とフィールドの任意のコレクションがあります。私は、次のクラスでこれらのフィールドへのアクセスを取得されていた:私は、テーブル名を知っている私のコード内のポイントに達するとレガシーテーブルでのActiveRecordクラスの使用

class Frt < ActiveRecord::Base 
    establish_connection :legacy 
    set_primary_key "point" 
end 

は、私が呼び出すことができます。

Frt.set_table_name "table" 
t = Frt.find_by_sql("blah") 
something = t.field_name + t.other_field_name 
etc... 

問題があることです私はこれが最初に選択するテーブルにアクセス可能なフィールド名をロックすることに気づいた。 `set_table_name 'メソッドの別の呼び出しでテーブルを変更しようとすると、そのクラスの属性が変更されますが、新しいインスタンスには最初のものと同じフィールドセットが残ります。これまでのところ、私のアプリでは何もする必要はありませんでしたが、私は道に突き当たるところで私を噛むことがわかっている方法でプログラムを拡張しています。

私は `Frt.send:set_table_name" new_table "を試して、ActiveRecordに再び魔法をさせることを期待しました。それはしません。

どのようにActiveRecordの便利さを保つことができるかもしれないが、ロードする必要があるテーブルのフィールドを動的に再マップできるようになる人はいますか?

+0

残りのコードを投稿できますか?あなたはどこでActiveRecordオブジェクトを作成しますか? – sethvargo

+0

これは私が上記のものではありませんか? 't = Frt.find_by_sql( "blah")' –

答えて

1

私自身の投稿には申し訳ありませんが、私はそれをとてもうまく説明していないと思います。この後に他の人が来た場合、私がする必要があったのは "Frt.reset_column_information"メソッドを呼び出すことでした。この問題をもう一度見直して、ActiveRecordクラスのすべてのメソッドをダンプしただけで、リストに潜んでいることが分かりました。

0

これを解決するより良い方法は、対話する必要のある各レガシーテーブルのモデルを作成することです。動的なテーブル名の再マッピングは不要で、すぐに使用できます。

+0

私はあなたのアドバイスをしましたが、フィールドはさまざまな要因によってテーブルのタイプごとに変わります。 –

1

これまで使ったことはありませんが、Magic Model Generatorはテーブルのモデルを自動的に作成すると主張しています。

関連する問題