activerecordを使用したオブジェクトからテーブルへ
-
03-07-2019 - |
質問
外部ライブラリからいくつかのオブジェクトを取得していますが、それらのオブジェクトをデータベースに保存する必要があります。オブジェクトから開始してテーブルと関係を作成する方法はありますか、それともそれらを掘り下げて手動で移行とモデルを作成する必要がありますか?
ありがとう! ロベルト
解決
たとえそのように動的にテーブルを動的に作成できたとしても(できると言っているわけではありません)。私はそれをしたくありません。エラーが発生する可能性は非常に高いです。
手動で移行を作成し、テーブルとフィールドを事前に作成して、必要に応じて行を入力します。
他のヒント
注:これはひどいハックであり、今後何年もバグを解決しますが、それでもかなり簡単です:
これはRails ActiveSupportに依存しており、ActiveRecordはすでにロードされています
2つのインスタンス変数を持つサードパーティライブラリからランダムオブジェクトを取得するとします。クラスは次のようになります。
class Animal
attr_accessor :name, :number_of_legs
end
a = SomeThirdPartyLibrary.get_animal
リフレクションを使用して、名前と列を把握できます:
table_name = a.class.to_s.tableize
column_names = a.instance_variables.map{ |n| n[1..-1] } # remove the @
column_types = a.instance_variables.map{ |n| a.instance_variable_get(n).class
}.map{ |c| sql_type_for_class(c) } # go write sql_type_for_class please
次に、ActiveRecordの移行を使用して、次のようにテーブルを作成できます。
ActiveRecord::Migration.class_eval do
create_table table_name do |t|
column_names.zip(column_types).each do |colname, coltype|
t.column colname, coltype
end
end
end
それからついに、作成したテーブルとインターフェースするactiverecordクラスを宣言できます。
# Note we declare a module so the new classes don't conflict with the existing ones
module GeneratedClasses; end
eval "class GeneratedClasses::#{a.class} < ActiveRecord::Base; end"
Presto!
これを行うことができます:
a = GeneratedClasses::Animal.new
a.update_attributes whatever
a.save
PS:これをしないでください!
ひどいことは別として、Railsアプリを再起動すると、生成されたクラスのすべての概念が失われるため、それらを永続化するための何らかのメカニズムを考案する必要があります。
この正確な状況があります。アプリケーションの外部のデータを読み取る必要があり、パフォーマンスヒットが非常に大きいため、ローカルに保存します。私は、データを操作し、データをテーブルに永続化できるスキーマと移行を手作業で開発してきたソリューションに取り組みました。データに対して機能するキャッシュスキームを開発し、パフォーマンスが大幅に向上しました。
とにかく、私はすべてを手作業で行いましたが、後悔していません。データベースが安定しており、dbテーブルをその場で再作成していないことを確信できます。そのため、アプリケーションの安定性について心配する必要はありません。
オブジェクトの処理内容に応じて、シリアル化します。
いくつかのORMソリューションをご覧ください。または、XMLとして保存します。