2017-07-20 14 views
1

オブジェクトとすべての関連オブジェクトをロードするにはどうすればよいですか?私は怠惰な読み込み(私はそれが怠惰な読み込みだと思うので)私に問題を引き起こしているので頼んでいる。 これは遅いことですが、このスクリプトは10分ごとに1回しか実行されないので問題ありません。ルビデータマッパー、ロードとオブジェクト、および関連するオブジェクト

Model_Object.all(load_all_now: true) 

答えて

1

残念ながら、それを行うための良い方法はありません。

のようなものがあります。

objects = ModelObject.all.map { |o| ModelObject.get(o.id) } 

もう少し複雑な、あなたがこのような方法でDataMapper::Resourceをオーバーロードできます。最も簡単な解決策は、実際のようなもので、一度にすべての属性をロードするよりもさらに遅いのは勿論である個々のレコードを照会することです。

def from_sql(sql, *bind_values) 
    self.repository.adapter.select(sql, *bind_values).map(&:as_json).map do |h| 
     if h.is_a?(Hash) 
     self.new(h) 
     else 
     self.new(id: h) 
     end.tap do |record| 
     record.persistence_state = DataMapper::Resource::PersistenceState::Clean.new(record) 
     end 
    end 
    end 

してから、このような何かを渡す:

properties = ModelObject.properties.map(&:field) 
objects = ModelObject.from_sql("SELECT #{properties.join(", ")} FROM table_name") 
+0

なぜ負荷のすべてのオブジェクトを強制する方法はありませんか? – Thermatix

+0

私はあなたにその答えを与えることができました。 DataMapperは、何年も前から維持されていなかった古いプロジェクトです。 ActiveRecordは飛躍的に進歩しており、開発者にとっては先進的ですが、私たちの一部は依然としてDMの使用に拘束されています。私の答えであなたが与えた方法は、私がDMの欠点を取り除くために取り組むアプリケーションに追加されましたが、常により多くのことがあります。 – Eugene

+0

次回はアクティブなレコードを統合するだけでいいと思います。 – Thermatix

関連する問題