include Railsを使用した積極的な読み込み中に、スコープでマージメソッドを使用します

ニール

これは、ビデオ鑑賞への質問のフォローアップであるcodeschoolスコープ上に、同様にすることにより、ビデオを見クリス・オリバーをマージする方法について。

私がやろうとしているのは、利用可能なauthorsものbook少なくとも1つあるものだけを見つけることです。次に、それらをフィルタリングした後authorsそれらの本に関するデータを引き出すたびにデータベースにクエリを実行したくないのでbooks、選択しauthorsものすべてを熱心にロードしたいと思います。私はいくつかの異なるスコープを試しましたが、どれも私が必要なものを正確に提供していません:

#app/models/book.rb 
class Book < ActiveRecord::Base
  belongs_to :author

  scope :available, ->{where(availability: true)}
  scope :unavailable, ->{where(availability: false)}
end

#app/models/author.rb
class Author < ActiveRecord::Base
  has_many :books, dependent: :destroy

  scope :with_available_books, ->{joins(:books).merge(Book.available)}
  scope :with_available_books_uniq, ->{uniq.joins(:books).merge(Book.available)}
  scope :with_available_books_includes, ->{joins(:books).merge(Book.available).includes(:books)}
  scope :with_available_books_uniq_includes, ->{uniq.joins(:books).merge(Book.available).includes(:books)}

  def to_s
    self.name
  end
end

これが私のデータベースにあるもののスナップショットです私は3つ 持っていますauthors

  1. Neil、および彼は合計10冊の関連書籍を持っており、すべてが利用可能です
  2. John、および彼は合計10冊の関連書籍を持っており、すべて利用できません
  3. Mixture Author、彼は合計10冊の本を持っており、5は利用可能、5は利用不可です

すべてのクエリを実行し、結果をHTMLで出力しました。これが私が得ているものです:

# Duplicating the authors AND N + 1 problem with associated books

Author.with_available_books.size:15
  本の著者[0]:10
  本の著者[1]:10

# Fixed the duplication but still N + 1 problem with the associated books

Author.with_available_books_uniq.size:
  著者用の本2冊[0]:10
  著者用の本[1]:10

# Fixed the N + 1 problem but duplicating authors

Author.with_available_books_includes.size:15

# Fixed the duplication and fixed the N + 1 problem
# BUT now it is filtering out the unavailable books!
# But I want all the Books for these authors!

Author.with_available_books_uniq_includes.size:2
  冊の著者[0]:10
  冊の著者[1]:5

重複していない著者のためにすべての本を入手するにはどうすればよいですか?関連付けられたオブジェクトの属性(本のavailable属性)で作成者をフィルタリングし、それらの本を熱心にロードしたいと思います。

ニール

途方に感謝クリス・オリバー、この状況についての私の電子メールの問い合わせへの対応のための自分自身。

最初に著者をつかみます:

@uniq_authors_with_available_books = Author.with_available_books_uniq

これは適切につかみNeilMixture Author両方が利用可能な本を持っている人:

2.2.1 :004 > @authors_with_available_books.size
=> 2 

ただし、以下に示すように、N + 1これら2人の著者の本に関する情報を取得したい場合は問題が依然として存在します。

2.2.1 :005 > @authors_with_available_books[0].books.size
  (0.2ms)  SELECT COUNT(*) FROM "books" WHERE "books"."author_id" = ?  [["author_id", 1]]
=> 10 

2.2.1 :006 > @authors_with_available_books[1].books.size
  (0.2ms)  SELECT COUNT(*) FROM "books" WHERE "books"."author_id" = ?  [["author_id", 3]]
=> 10

クリスのアドバイスに感謝します。私たちがしなければならないのはからの 'subqueryを使用した本に対する個別のクエリです。id@authors_with_available_books

2.2.1 :007 > @books_by_those_authors = Book.where(author_id: @authors_with_available_books.map(&:id)) 
  Book Load (0.4ms)  SELECT "books".* FROM "books" WHERE "books"."author_id" IN (1, 3)

SQLクエリから、id1またはに等しい本のみを取得していることがわかります3最初のクエリでは、利用可能な本を持っているのはそれらの著者だけであることがわかったため、これらの著者を取得しているだけです。

今、私はこれを行うことができます:

@books.size
=> 20 

これは、合計10Neil冊の本と合計Mixture Author10冊の本があり、合計でが得られるため、理にかなっています20

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Include()を使用したLINQ toSQLを使用した積極的な読み込み

分類Dev

Railsのスコープを使用した積極的な読み込み

分類Dev

php include を使用したソース コードの不要な改行

分類Dev

RAILS3.2のincludeメソッドを使用して特定のコンテンツを持つ現在のページまたはルート

分類Dev

.Include()を使用して積極的にロードしようとすると、EFCoreが遅延ロードされます

分類Dev

「-I」を使用してg ++インクルードパスを定義します。「... / include / boost」ではなく「... / include」を設定した場合にのみ機能するのはなぜですか?

分類Dev

コードを変更してパフォーマンスを向上させます(積極的な読み込み)

分類Dev

JSTLで使用するためにpagecontext.includeを使用してページスコープ属性をJSPに渡しますか?

分類Dev

パラメータを使用した積極的な読み込み-laravel

分類Dev

DBContextFindメソッドを使用して積極的な読み込みを指定する方法

分類Dev

可変数のメソッドパラメーターを使用した<ui:include>でのパラメーター化されたメソッド呼び出し

分類Dev

@includeを使用してページ固有のリソースをロードします

分類Dev

Visual C ++のプリコンパイル済みヘッダーでforce includeを使用できますか?

分類Dev

EF Fluent Mappingは、インクルードを使用して積極的な読み込みですべての子を読み込みません

分類Dev

クエリビルダーを使用したLaravelの積極的な読み込みでwhereRaw条件を使用する

分類Dev

jsp:includeは、コントローラーの戻り値で機能しないコントローラーメソッドを指しています

分類Dev

ng-includeを使用したエンドレスループ

分類Dev

#include <thread>を使用してスレッドを作成中にセグメンテーション違反が発生しました

分類Dev

sequelizeJsにインクルードを使用した複数の積極的な読み込み

分類Dev

javascript_include_tagはサポートされていないメソッドをスローします

分類Dev

Laravel5.7-morphMany関係とカスタム属性ゲッターを使用した積極的な読み込み

分類Dev

angleJSのng-includeを使用して、イオンテンプレート内にion-header-barを埋め込みます

分類Dev

includeオプションを使用して特定のタイプのファイルのみをrsyncでコピー

分類Dev

<include>コマンドを使用してXMLコードが含まれている場合、画像に対してオプションが機能しないをクリックします

分類Dev

PHP と HTML のヘッダーに "Include" メソッドを使用する

分類Dev

Asp.NetCoreのFindメソッドのIncludeとWhereを使用します

分類Dev

ブックダウンの問題-knitr :: include_graphics()-画像のURLを使用して「画像またはPDFファイルを読み込めません」

分類Dev

{%include ...%}コードブロックを使用したGitHubフレーバーマークダウン

分類Dev

ネストされた積極的な読み込みに複数のスコープを追加する

Related 関連記事

  1. 1

    Include()を使用したLINQ toSQLを使用した積極的な読み込み

  2. 2

    Railsのスコープを使用した積極的な読み込み

  3. 3

    php include を使用したソース コードの不要な改行

  4. 4

    RAILS3.2のincludeメソッドを使用して特定のコンテンツを持つ現在のページまたはルート

  5. 5

    .Include()を使用して積極的にロードしようとすると、EFCoreが遅延ロードされます

  6. 6

    「-I」を使用してg ++インクルードパスを定義します。「... / include / boost」ではなく「... / include」を設定した場合にのみ機能するのはなぜですか?

  7. 7

    コードを変更してパフォーマンスを向上させます(積極的な読み込み)

  8. 8

    JSTLで使用するためにpagecontext.includeを使用してページスコープ属性をJSPに渡しますか?

  9. 9

    パラメータを使用した積極的な読み込み-laravel

  10. 10

    DBContextFindメソッドを使用して積極的な読み込みを指定する方法

  11. 11

    可変数のメソッドパラメーターを使用した<ui:include>でのパラメーター化されたメソッド呼び出し

  12. 12

    @includeを使用してページ固有のリソースをロードします

  13. 13

    Visual C ++のプリコンパイル済みヘッダーでforce includeを使用できますか?

  14. 14

    EF Fluent Mappingは、インクルードを使用して積極的な読み込みですべての子を読み込みません

  15. 15

    クエリビルダーを使用したLaravelの積極的な読み込みでwhereRaw条件を使用する

  16. 16

    jsp:includeは、コントローラーの戻り値で機能しないコントローラーメソッドを指しています

  17. 17

    ng-includeを使用したエンドレスループ

  18. 18

    #include <thread>を使用してスレッドを作成中にセグメンテーション違反が発生しました

  19. 19

    sequelizeJsにインクルードを使用した複数の積極的な読み込み

  20. 20

    javascript_include_tagはサポートされていないメソッドをスローします

  21. 21

    Laravel5.7-morphMany関係とカスタム属性ゲッターを使用した積極的な読み込み

  22. 22

    angleJSのng-includeを使用して、イオンテンプレート内にion-header-barを埋め込みます

  23. 23

    includeオプションを使用して特定のタイプのファイルのみをrsyncでコピー

  24. 24

    <include>コマンドを使用してXMLコードが含まれている場合、画像に対してオプションが機能しないをクリックします

  25. 25

    PHP と HTML のヘッダーに "Include" メソッドを使用する

  26. 26

    Asp.NetCoreのFindメソッドのIncludeとWhereを使用します

  27. 27

    ブックダウンの問題-knitr :: include_graphics()-画像のURLを使用して「画像またはPDFファイルを読み込めません」

  28. 28

    {%include ...%}コードブロックを使用したGitHubフレーバーマークダウン

  29. 29

    ネストされた積極的な読み込みに複数のスコープを追加する

ホットタグ

アーカイブ