6

Rails にはカスタムの find_by_sql クエリがいくつかあります。それらで熱心な読み込みを使用したいのですが、これを行う良い方法はないようです。

eager_custom.rb ファイルがあちこちにあるのを見たことがありますが、現在 Rails では動作しないようです。Rails は、過去に使用された単一の結合クエリの代わりに、2 つのクエリ (通常のクエリと、最初のクエリの ID に 'id IN' が含まれるクエリ) を使用して、異なる方法で熱心な読み込みを行っているようです。

私の質問は、カスタム SQL クエリを実行してから 'id IN' クエリを実行した場合、関連するオブジェクトを最初のクエリ結果に戻す方法はありますか?

たとえば、find_by_sql でトピックを読み込んでいて、トピック ID にトピック ID が含まれているトピック画像を見つけました。画像を手動でトピックに追加する方法はありますか?

ありがとう

4

1 に答える 1

10

お気づきのとおり、Rails 2.1 では、複数のクエリを使用する新しい種類のeager/pre-loading が導入されましたid IN (...)。この方法は通常、特に複数の関連付けが事前にロードされている場合に高速です。この機能は、ActiveRecord から継承されたクラス メソッドfind_by_sqlを使用して手動で使用できます (推奨されません)。preload_associations例えば:

class Person
  def self.find_a_special_group
    people = find_by_sql("...")
    preload_associations(people, [:jobs, :addresses])
    return people
  end
end

このpreload_associationsメソッドは保護されているため、クラス内から呼び出す必要があり、(1) オブジェクトの配列、(2) 関連の配列、ハッシュ、またはシンボル (find:includeオプションと同じ形式)、および (3)を取ります。 ) オプション ハッシュ。詳細については、ActiveRecord::AssociationPreload::ClassMethods モジュールのドキュメントを参照してください。

ただし、そうは言っても、Rails のドキュメントではプログラマーが直接使用することを思いとどまらせているため、この手法は確かに望ましくありません。preload_associations本当に使用する必要がありますfind_by_sqlか? すべてのオプションfindが必要であることを本当に知っていますか? ( :select:from:joins:group:havingなど) が必要ないと言っているわけではありませんがfind_by_sql、確認するのに数分かかるかもしれません。

于 2009-12-17T22:09:25.323 に答える