2016-06-20 3 views
1

私はORM ActiveRecordのリレーショナルデータベース(例えばRailsの中に)についての質問があります:データベース層にしている場合は発生しません(例えばインナー参加)アクティブレコードは、リレーショナルデータベースのオーバーヘッドに結合されていますか?

私は混乱している加入I ActiveRecordはいくつかのクエリを作成し、レコード自体に参加します。

オーバーヘッドではありませんか? Rubyはデータベースの仕事をしています!
私は間違っていますか?
アドバイスありがとうございます。

私はRailsのを練習し、外部キーは以下のようにデータベース自体に定義されていない理由を不思議に思った。

MySql view with no foreign key defined

ありがとうございました。

+0

私は完全に同意します。 Railsは、リレーショナルデータベースの上にナビゲーションデータベースを再作成しようとします。私はSQLがよりシンプルで豊かな表現力と強力であることを発見して以来、私はORMを使用していません。 – reaanb

答えて

0

デフォルトでは、Railsは関連付けの読み込みに遅延があります。

users = User.where(id: [1768, 1769, 1770]) 

あなたはuser.companyを求める場合には(例えば)データベースは、適切な会社のために再度照会する各1のための今すぐ

SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1768, 1769, 1770) 

を呼び出します。


ActiveRecordを使用すると、クエリのデータベース側でジョインを行い、データベース側で実行させることもできます。例:

User.joins(:company).where(companies: {id: 5}) 

あなたはまた、1つのクエリでレコードのセットをロードすることができ、1つの余分なクエリ内のすべての関連付けが

SELECT `users`.* FROM `users` INNER JOIN `companies` ON `companies`.`id` = `users`.`company_id` WHERE `companies`.`id` = 5 

を呼び出します:

users = User.where(id: [1768, 1769, 1770]).includes(:company) 

のロードが終わるだろうユーザー、会社の順番

SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1768, 1769, 1770) 
SELECT `companies`.* FROM `companies` WHERE `companies`.`id` IN (5, 1) 

ロードされた各ユーザーに対して、たとえば、users[0].companyを要求すると、既に読み込まれた関連付けが使用され、データベースにヒットしません。

+0

助けていただきありがとうございます – MalekMFS

関連する問題