- N + 1つの問題
N + 1つの質問:
何である:例えば、リストの関係がテーブルBからクエリを実行する必要がn回ため(プライマリ・テーブル)合計クエリ、実行するn個のデータ取得の一次表A一度、(表から)リストB関連付けられています番号n + 1。パフォーマンスの問題を引き起こしてテーブルの上に複数のクエリ、これは、n + 1つの問題です。
理由:メインテーブルクエリは一度だけ、本当にパフォーマンスの問題を引き起こして、テーブルから関連するクエリに一つずつ、n回を必要としています。
溶液:(1)いい加減:再クエリと時間
(2)レールが解決策をお勧めは:(予圧とeager_loadを含み、事前にロードすることができる);交差点に、ジョイン内であるジョインテーブルから供給含みます#n+1问题 User.all.each do |user| p user.blogs end #查询user表时,把includes进blogs User.includes(:blogs).each do |user| p user.blogs end #使用joins,会产生重复记录,可以用uniq去除 User.joins(:blogs) 或Blog.joins(:user) #select users.* from users inner joins blogs on users.id=blogs.user_id #select blogs.* from blogs inner joins users ... #另外:使用joins关联多个对象 User.joins(:blogs,:articles) <===> User.joins(:blogs).joins(:articles) #select users.* from users #inner joins blogs on users.id=blogs.user_id #inner joins articles on users.id=articles.user_id