Trong Rails, bạn có thể truy vấn cơ sở dữ liệu thông qua các mô hình của mình để truy cập dữ liệu của bạn.
Bạn có thể thực hiện việc này bằng cách sử dụng ActiveRecord
phương pháp.
Giống như where
, find
hoặc find_by
.
Kết quả bạn nhận được :
- Với
find_by
, một bản ghi hoặcnil
- Với
where
, mộtActiveRecord::Relation
đối tượng - Với
find
, một bản ghi duy nhất, được tìm thấy bởi cột chính của nó (thường làid
), đưa ra một ngoại lệ nếu không tìm thấy
Nói cách khác :
Nếu bạn đang mong đợi một bản ghi (một người dùng cụ thể), hãy sử dụng find_by
, đối với nhiều bản ghi (danh sách người dùng), hãy sử dụng where
.
Nhưng where
có nhiều cách để sử dụng, điều này thường gây nhầm lẫn cho người mới bắt đầu.
Không sao!
Chúng ta sẽ xem xét các cách khác nhau mà bạn có thể sử dụng where
trong các ứng dụng Rails của bạn.
Điều kiện cơ bản ở đâu
Mục đích của việc sử dụng where
là tạo một truy vấn lọc thông tin trong cơ sở dữ liệu của bạn, vì vậy bạn chỉ nhận được các hàng bạn muốn.
Ví dụ :
Được tặng một Book
mô hình, với title
, author
&category
.
Bạn có thể muốn tìm hiểu tất cả các sách của một tác giả cụ thể hoặc tất cả các sách thuộc một danh mục cụ thể.
Đây là một truy vấn :
Book.where(category: "Ruby")
Thao tác này trả về tất cả các sách có category
của “Ruby”.
Bạn cũng có thể kết hợp các điều kiện.
Như thế này :
Book.where(category: "Ruby", author: "Jesus Castello")
Thao tác này trả về các sách phù hợp với cả category
&author
.
Và bạn có thể kết hợp where
với một phạm vi.
# scope definition class Book scope :long_title, -> { where("LENGTH(title) > 20") } end # controller code @books = Book.long_title.where(category: "Ruby")
Sử dụng hàm băm (fruit: "apple"
), cho phép bạn kiểm tra xem một cột có bằng thứ gì không.
Nhưng nếu bạn không tìm kiếm sự bình đẳng thì sao?
Sau đó, bạn sẽ phải sử dụng một chuỗi.
Đường ray ở đâu:Lớn hơn &nhỏ hơn
Nếu bạn muốn kiểm tra “lớn hơn”, “nhỏ hơn” hoặc những thứ tương tự…
Làm như thế này :
Book.where("LENGTH(title) > 20")
Nếu bạn cần nội suy các giá trị…
Làm như thế này :
Book.where("LENGTH(title) > ?", params[:min_length])
?
này được gọi là “trình giữ chỗ” và nó được sử dụng để bảo mật nhằm tránh các cuộc tấn công “đưa vào SQL”.
Một tùy chọn khác là sử dụng trình giữ chỗ được đặt tên.
Ví dụ :
Book.where("LENGTH(title) > :min", min: params[:min_length])
Tôi thấy điều này ít phổ biến hơn trình giữ chỗ dấu chấm hỏi, nhưng nó có thể hữu ích cho các truy vấn liên quan đến nhiều giá trị nội suy.
Cách sử dụng khi Không và Ở đâu Hoặc Điều kiện
Hãy xem xét các truy vấn phức tạp hơn.
Nếu bạn muốn kiểm tra xem một điều kiện KHÔNG đúng, thì bạn có thể kết hợp where
với not
phương pháp.
Đây là một ví dụ :
Book.where.not(category: "Java")
Một ví dụ khác :
Book.where.not(title: nil)
Điều này tìm thấy Book
s với title
đó không phải là nil
.
Còn điều kiện HOẶC thì sao?
Bạn có thể kết hợp where
với or
để lấy các hàng phù hợp với BẤT KỲ hai điều kiện nào trở lên.
Đây là cách hoạt động :
Book.where(category: "Programming").or(Book.where(category: "Ruby"))
Điều này kết hợp hai where
các truy vấn thành một.
Hãy thử!
Ví dụ về Rails Where IN Array
Tất cả các ví dụ mà chúng tôi đã thấy đều tìm kiếm một giá trị cụ thể.
Nhưng bạn có thể tìm kiếm nhiều giá trị.
Làm thế nào?
Sử dụng một mảng!
Ví dụ :
Book.where(id: [1,2,3])
Điều này tạo ra một truy vấn “IN” sẽ tìm kiếm đồng thời tất cả các id này.
SELECT "books".* FROM "books" WHERE "books"."id" IN (1, 2, 3)
Bạn sẽ tìm thấy truy vấn này trong nhật ký đường ray.
Rails Tham gia Điều kiện Hiệp hội
Nếu bạn đang muốn so khớp dựa trên một giá trị liên kết, bạn sẽ phải cung cấp liên kết đó với các joins
phương pháp.
Sau đó, bạn có thể làm điều này :
Book.joins(:comments).where(comments: { id: 2 })
Với truy vấn này, bạn sẽ nhận được tất cả các sách có nhận xét và nhận xét id
là 2
.
Đối với phiên bản chuỗi :
Book.joins(:comments).where("comments.id = 2")
Nơi comments
là tên bảng và id
là tên cột.
Cách tìm kiếm trong văn bản với điều kiện giống như ở đâu
Nếu bạn muốn triển khai một chức năng tìm kiếm, bạn có thể muốn cho phép đối sánh một phần.
Bạn có thể thực hiện việc này với truy vấn “LIKE”.
Đây là một ví dụ :
Book.where("title LIKE ?", "%" + params[:q] + "%")
Điều này sẽ tìm thấy tất cả các tiêu đề có văn bản tìm kiếm, được cung cấp bởi params (params[:q]
), bất kỳ đâu bên trong tiêu đề.
Truy vấn rất hữu ích!
biểu tượng phần trăm là gì ?
Trong SQL, %
là một ký tự đại diện.
Video:Chi tiết ở đâu so với Find_By
Tóm tắt
Bạn đã học cách sử dụng Rails where
phương pháp để truy vấn ActiveRecord
của bạn mô hình!
Bao gồm :
- Cách lọc theo nhiều điều kiện
- Cách sử dụng mảng để tìm nhiều hàng một cách hiệu quả
- Cách sử dụng
where
kết hợp vớior
¬
các phương pháp để viết các truy vấn phức tạp hơn
Bây giờ đến lượt bạn áp dụng điều này vào thực tế.
Cảm ơn vì đã đọc 🙂