Ruby on Railsの「has_many」アレイは、「知る必要がある」ベースでデータを提供しますか?
-
04-10-2019 - |
質問
Ruby on Railsで、Actor ModelオブジェクトがTom Hanksであり、「Has_many」ファンが20,000のファンオブジェクトである場合、
actor.fans
20,000の要素を持つ配列を提供します。おそらく、要素には値が事前に入力されていませんか?それ以外の場合、DBから各アクターオブジェクトを取得するのは非常に時間がかかる場合があります。
それで、それは「知る必要がある」ベースにありますか?
Actor.fans [500]にアクセスするとデータをプルし、Actor.fans [0]にアクセスするとデータをプルしますか?各レコードからレコードにジャンプする場合、シーケンシャルな読み取りを実行してパフォーマンスを最適化することはできません。これらのレコードは近くのセクター /プラッター層にある可能性があるため、ハードディスクでより速くなります。たとえば、たとえば、このプログラムは2つのランダムな要素に触れてから、これらの2つのレコードを読むだけで高速になりますが、すべての要素にランダムな順序でタッチした場合、すべてのレコードを連続的に読み取り、ランダムを処理するだけで速くなる可能性があります。要素。しかし、RORは、私がいくつかのランダムな要素しかしていないのか、それともすべての要素をランダムにしているのかをどのように知るでしょうか?
解決
2つしか使用していないのに、なぜ50000のレコードを取得したいのですか?次に、これら2つだけをDBから取得します。ファンをリストしたい場合は、おそらくページネーションを使用します。つまり、クエリで制限とオフセットを使用するか、Will_Paginateのようなページネーションジェムを使用します。
論理的な説明がないのは、なぜあなたがしようとする方法を行かなければならないのか。私たちがあなたを助けることができるように、本当の状況を説明してください。
ただし、DBから多くの関連オブジェクトをロードすることを知る必要があると思う人がいます - 使用:
Actor.all(:include => :fans)
これにより、すべてのファンが熱心になり、n+1の代わりに2つのクエリしかありません。nは俳優の量です
他のヒント
開発モードでサーバーによって噴出されるSQLを見てください。これにより、ロードされているファンレコードの数がわかります。この場合 actor.fans
確かにそれらはすべてロードされますが、これはおそらくあなたが望むものではありません。
いくつかのオプションがあります:
- TADASが提案したように、ページネーターを使用します。
- 興味のあるものだけを引き込むファンテーブルとの別の関連付けを設定します。これは、has_manyステートメントの条件で行うことができます。
has_many :fans, :conditions => "country of residence = 'UK'"
- 完全なSQLを指定して、
:finder_sql
オプション - 指定
:limit
まったく制限されているオプションは、返された行の数を制限します。
すべてがあなたがしたいことに依存します。