Rails N+1問題 with joins, includes, preload and eager_load

資料庫的操作是影響網站效能的重要因素,而在存取資料時幾乎一定會遇到 N+1 問題。本篇文章將簡要探討 includes 的使用時機,以及與其相似的 preload 和 eager_load 方法。此外,我們還會介紹在處理多表格操作時常用的 joins。 1. 造成 N+1 問題的原因 我們先想像一個情境,你正在開發商家的訂單系統,其中有兩個 Model,分別是Customer與Order,Customer記載顧客資料,並且每個顧客擁有多筆訂單Order # customer.rb class Customer < ApplicationRecord has_many :orders end # order.rb class Order < ApplicationRecord belongs_to :customer end 現在我們想要呈現4位顧客的個人資訊以及他們各自的所有訂單,你可能會這樣寫: Customer.limit(4).each{|customer| puts customer.orders} Rails ORM 產生的 SQL 指令如下: SELECT 'customers'.* FROM 'customers' LIMIT 4 SELECT 'orders'.* FROM 'orders' WHERE 'orders'.'customer_id'=1 SELECT 'orders'.* FROM 'orders' WHERE 'orders'.'customer_id'=2 SELECT 'orders'.* FROM 'orders' WHERE 'orders'.'customer_id'=3 SELECT 'orders'.* FROM 'orders' WHERE 'orders'....

June 8, 2023 · 291 words · HSIAO, YI-HUSAN

Rails 基礎 ORM 的 SQL 語法

儘管Rails開發者可以透過 ActiveRecord 簡單地操作資料庫資源,但仍然需要了解基本的 SQL 語法。以下是常見 ORM 指令的翻譯,可以幫助你真正理解背後的運作原理。 較複雜的資料庫關係語法(例如:includes、join)將不在條列於本文中,我們將在另一篇文章中探討這些內容。 Create create: 使用 create 創建資料,或透過 new 產生物件之後再使用 save,以上狀況所產生的SQL語法如下。 Book.create(name: "學習Rails", author: "Eddie", intro: "學習Rails好幫手", price: 100) or Book.new(name: "學習Rails", author: "Eddie", intro: "學習Rails好幫手", price: 100) Book.save INSERT INTO books(name, author, intro, price, updated_at) VALUES ('學習Rails', 'Eddie', '學習Rails好幫手', 100, '2023...') Read all: Book.all SELECT * FROM books select or pluck: select 和 pluck 最終得到的資料形式不同,這裡不多做討論,只要知道Rails進一步的處理是在從資料庫抓取資料後,兩者前期的SQL語法沒有不同 Book.select("name") Book.pluck("name") SELECT name FROM books limit or offset: Book....

June 4, 2023 · 510 words · HSIAO, YI-HUSAN