Railsのアップグレードにはメソッドの動作の変更が含まれます

アンドリューオルゴール

私は数日間掘り下げていましたが、この動作の変化についての適切な説明が見つかりませんでした。Railsアプリケーションを3.2から5.2にアップグレードしている最中です。これは、Rails3アプリの合格テストのコードです。

 ps = Project.includes(:rentals).where('rentals.id IN (?)', [1,2,3,4])

これは、大きな古い左結合SQLクエリを吐き出します。
しかし、Rails 5で同じクエリを実行すると、mysqlエラーが発生します

ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'rentals.id' in 'where clause': SELECT  `projects`.* FROM `projects` WHERE (rentals.id IN (1,2,3,4)) LIMIT 11 /*application:ConHQ*/)

インクルードについての私の理解は、インクルードされたテーブルがwhere句で参照されていない限り、個別のクエリを実行する必要があるということです。参照されている場合は、左結合を実行する必要があります。しかし、それはここでは起こっていないようです。この場合、eager_loadの使用は機能します。

 ps = Project.eager_load(:rentals).where('rentals.id IN (?)', [1,2,3,4])

しかし、私はインクルードが同じことをするべきだと思いました。
私も時々含まれていることに気づいたeager_loadと同じクエリを実行します

@project = Project.find(174)
@project.rentals.eager_load(:equipment_name).where('equipment_names.id IN (?)', [1,2,3,4])
@project.rentals.includes(:equipment_name).where('equipment_names.id IN (?)', [1,2,3,4])

この場合、eager_loadとインクルードの両方が左結合を実行します。これらの状況でインクルードの動作が異なる理由を説明するドキュメントは見つかりませんでした。インクルードは、実行するクエリをどの程度正確に選択しますか?

ミルグナー

includesActiveRecordにデータを熱心にロードする必要があることを伝えるだけですが、これは好きなように実現できます。クエリで他のモデルを参照する場合はreferences(:rentals)、も使用する必要があります。

ActiveRecord APIは非常に強力で用途が広いですが、Rubyとそのライブラリでよくあることですが、何かを実現する方法はたくさんあります。この場合、を使用mergeして別の関係にマージすることもできます

rentals = Rental.where(id: [1,2,3,4])
projects = Project.joins(:rentals).merge(rentals) # you can additionally add includes, too, if you want to access the rentals

これには、Rentalモデルのテーブル名を気にする必要がないという追加の利点があります

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

侵害の場合は、連絡してくださいdebugcn@gmail.com

編集
0

コメントを追加

0

関連記事

分類Dev

Mockitoはメソッドの動作を変更します

分類Dev

並行性アプローチのメソッドでのArrayIndexOutOfBoundsExceptionには、次のものが含まれます。

分類Dev

NameError:未定義のローカル変数またはメソッド `app'for-Rails5.1.6がアップグレードされました

分類Dev

16.10から17.04にアップグレードした後、ショートカットの動作が変更されました

分類Dev

AsyncTaskのget()メソッドの動作は、さまざまなAPIレベルで変更されました

分類Dev

DbSetには拡張メソッドのループが含まれます

分類Dev

dpkg-divert:エラー:16.04から16.10にアップグレードした後、名前の変更にエラーの上書きが含まれます

分類Dev

SDKをアップグレードした後、コードの動作が変わりますか?

分類Dev

メソッドの動作を変更せずにメソッドにパッチを適用しますか?

分類Dev

Gradleのアップグレード後、Lombokは動作を停止します

分類Dev

Javaメソッドには、例外をスローする別のメソッドが含まれています

分類Dev

Rails3からのアップグレード後にRails4メソッドは許可されません

分類Dev

アニメーションの高さと幅が石積みグリッドレイアウトに変更されます。CSSグリッドの代替?

分類Dev

エスプレッソタイムアイドラーはどのように動作しますか?

分類Dev

laravel 6.0にアップグレード-「デフォルト」メソッドが原因で動作中の移行が失敗するようになりました。MariaDBの問題である可能性があります

分類Dev

Spring Boot 2.4にアップグレードすると、GrantedAuthoritiesMapperがOAuthでの動作を停止します

分類Dev

メソッドのjUnit変更動作

分類Dev

apt-getアップグレードはUbuntuLTSのソフトウェアのメジャーバージョンを変更しますか?

分類Dev

apt-getアップグレードはUbuntuLTSのソフトウェアのメジャーバージョンを変更しますか?

分類Dev

アグリゲートは、それ自体の状態のみに基づいてその動作を認識し、基づいている必要がありますか?アグリゲートは、その動作(メソッド)で他のアグリゲートの状態を使用できますか?

分類Dev

アップグレード後にデフォルトのホームレンズが変更されました。それは正常ですか?

分類Dev

javascriptは動的にロードされたポップアップ要素の内容を変更します

分類Dev

apt-get full-upgradeには更新が含まれますか(または両方のタイプのアップグレードのみ)?

分類Dev

mongo-java-driver3.3.0へのアップグレード中にfindOneの実装が変更されました

分類Dev

zshのアップグレード後に「ls」の色が変更されました

分類Dev

「多対多に含まれる」ためのRailsスコープメソッド

分類Dev

TestNGに含まれるグループの定義とメソッドは相互に排他的ですか?

分類Dev

Java Generics:arraylist(無制限のワイルドカードタイプ)では、addメソッドとaddAllメソッドの動作が異なります

分類Dev

メソッド内のローカル変数を変更します。メソッドが実行されても、変数は変更されません。

Related 関連記事

  1. 1

    Mockitoはメソッドの動作を変更します

  2. 2

    並行性アプローチのメソッドでのArrayIndexOutOfBoundsExceptionには、次のものが含まれます。

  3. 3

    NameError:未定義のローカル変数またはメソッド `app'for-Rails5.1.6がアップグレードされました

  4. 4

    16.10から17.04にアップグレードした後、ショートカットの動作が変更されました

  5. 5

    AsyncTaskのget()メソッドの動作は、さまざまなAPIレベルで変更されました

  6. 6

    DbSetには拡張メソッドのループが含まれます

  7. 7

    dpkg-divert:エラー:16.04から16.10にアップグレードした後、名前の変更にエラーの上書きが含まれます

  8. 8

    SDKをアップグレードした後、コードの動作が変わりますか?

  9. 9

    メソッドの動作を変更せずにメソッドにパッチを適用しますか?

  10. 10

    Gradleのアップグレード後、Lombokは動作を停止します

  11. 11

    Javaメソッドには、例外をスローする別のメソッドが含まれています

  12. 12

    Rails3からのアップグレード後にRails4メソッドは許可されません

  13. 13

    アニメーションの高さと幅が石積みグリッドレイアウトに変更されます。CSSグリッドの代替?

  14. 14

    エスプレッソタイムアイドラーはどのように動作しますか?

  15. 15

    laravel 6.0にアップグレード-「デフォルト」メソッドが原因で動作中の移行が失敗するようになりました。MariaDBの問題である可能性があります

  16. 16

    Spring Boot 2.4にアップグレードすると、GrantedAuthoritiesMapperがOAuthでの動作を停止します

  17. 17

    メソッドのjUnit変更動作

  18. 18

    apt-getアップグレードはUbuntuLTSのソフトウェアのメジャーバージョンを変更しますか?

  19. 19

    apt-getアップグレードはUbuntuLTSのソフトウェアのメジャーバージョンを変更しますか?

  20. 20

    アグリゲートは、それ自体の状態のみに基づいてその動作を認識し、基づいている必要がありますか?アグリゲートは、その動作(メソッド)で他のアグリゲートの状態を使用できますか?

  21. 21

    アップグレード後にデフォルトのホームレンズが変更されました。それは正常ですか?

  22. 22

    javascriptは動的にロードされたポップアップ要素の内容を変更します

  23. 23

    apt-get full-upgradeには更新が含まれますか(または両方のタイプのアップグレードのみ)?

  24. 24

    mongo-java-driver3.3.0へのアップグレード中にfindOneの実装が変更されました

  25. 25

    zshのアップグレード後に「ls」の色が変更されました

  26. 26

    「多対多に含まれる」ためのRailsスコープメソッド

  27. 27

    TestNGに含まれるグループの定義とメソッドは相互に排他的ですか?

  28. 28

    Java Generics:arraylist(無制限のワイルドカードタイプ)では、addメソッドとaddAllメソッドの動作が異なります

  29. 29

    メソッド内のローカル変数を変更します。メソッドが実行されても、変数は変更されません。

ホットタグ

アーカイブ