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ặcnil - Với
where, đối tượngActiveRecord::Relation - Với
find, một record đơn lẻ, tìm bằng khóa chính (thườngid), 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
wherekết hợpor¬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 🙂