Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Thành Thạo Phương Thức `where` Của Rails: Ví Dụ Thực Hành & Best Practices

Trong Rails, bạn truy vấn database qua model để truy cập dữ liệu. Dùng các phương thức ActiveRecord. Như where, find, hoặc find_by. Kết quả:

  • Với find_by, một record đơn lẻ hoặc nil
  • Với where, đối tượng ActiveRecord::Relation
  • Với find, một record đơn lẻ, tìm bằng khóa chính (thường id), raise exception nếu không tìm thấy

Nói cách khác: Nếu mong đợi một record (user cụ thể), dùng find_by, cho nhiều record (danh sách user) dùng where. Nhưng where có nhiều cách dùng, thường gây nhầm lẫn cho người mới. Không sao! Chúng ta xem các cách dùng where trong Rails app.

Điều Kiện Where Cơ Bản

Mục đích where là xây dựng query lọc thông tin trong DB, chỉ lấy hàng bạn muốn. Ví dụ: Model Book với title, author & category. Muốn tìm tất cả sách của tác giả cụ thể, hoặc sách dưới category đặc biệt. Query:

Book.where(category: "Ruby") 

Trả về sách có category "Ruby". Kết hợp điều kiện:

Book.where(category: "Ruby", author: "Jesus Castello") 
Trả về sách khớp cả category & author. Kết hợp where với scope:
# scope definition
class Book
  scope :long_title, -> { where("LENGTH(title) > 20") }
end
# controller code
@books = Book.long_title.where(category: "Ruby") 
Dùng hash (fruit: "apple") cho phép check cột bằng giá trị. Nhưng nếu không tìm equality? Thì dùng string.

Rails Where: Greater Than & Less Than

Muốn check "greater than", "less than"... Làm như sau:

Book.where("LENGTH(title) > 20") 

Cần interpolate giá trị... Làm như sau:

Book.where("LENGTH(title) > ?", params[:min_length]) 

Dấu ? gọi là "placeholder", dùng cho bảo mật tránh "SQL injection". Tùy chọn khác: named placeholders. Ví dụ:

Book.where("LENGTH(title) > :min", min: params[:min_length]) 

Tôi thấy ít phổ biến hơn placeholder dấu hỏi, nhưng hữu ích cho query nhiều giá trị interpolated.

Cách Dùng Where Not & Where Or

Xem query phức tạp hơn. Muốn check điều kiện KHÔNG đúng, kết hợp where với not. Ví dụ:

Book.where.not(category: "Java") 

Ví dụ khác:

Book.where.not(title: nil) 

Tìm Book có title không nil. Còn OR condition? Kết hợp where với or lấy hàng khớp BẤT KỲ điều kiện nào. Cách hoạt động:

Book.where(category: "Programming").or(Book.where(category: "Ruby")) 

Gộp hai query where thành một. Thử đi!

Ví Dụ Rails Where IN Array

Các ví dụ trước tìm một giá trị cụ thể. Nhưng có thể tìm nhiều giá trị. Làm sao? Dùng mảng! Ví dụ:

Book.where(id: [1,2,3]) 

Tạo query "IN" tìm đồng thời tất cả id này.

SELECT "books".* FROM "books" WHERE "books"."id" IN (1, 2, 3) 
Bạn thấy query này trong rails logs.

Điều Kiện Association Với Rails Joins

Nếu tìm dựa trên giá trị association, phải làm association available với joins. Sau đó:

Book.joins(:comments).where(comments: { id: 2 }) 

Lấy tất cả sách, có comment, và comment id là 2. Phiên bản string:

Book.joins(:comments).where("comments.id = 2") 

comments là tên bảng, id tên cột.

Cách Tìm Kiếm Bên Trong Text Với Where LIKE

Muốn implement search, cho phép partial match. Dùng query "LIKE". Ví dụ:

Book.where("title LIKE ?", "%" + params[:q] + "%") 

Tìm tất cả title chứa text search từ params (params[:q]) bất kỳ đâu trong title. Query rất hữu ích! Ký hiệu phần trăm là gì? Trong SQL, % là wildcard character.

Video: Where vs Find_By Chi Tiết

Tóm Tắt

Bạn đã học cách dùng phương thức where Rails truy vấn model ActiveRecord! Bao gồm:

  • Lọc bằng nhiều điều kiện
  • Dùng mảng tìm nhiều hàng hiệu quả
  • Dùng where kết hợp or & not viết query phức tạp

Bây giờ lượt bạn áp dụng thực tế. Cảm ơn bạn đã đọc 🙂