Thứ Sáu, 12 tháng 9, 2014

Model - Các phương pháp tìm kiếm database trong một Model của Ruby on rails

Mỗi Model trong RoRs được map với một Database table tương ứng trong cơ sở dữ liệu SQline, mySQL...
RoRs đã xây dựng sẵn những method giúp chúng ta dễ dàng tim kiếm ( lọc ) dữ liệu trong database theo những yêu cầu tìm kiếm. Vấn đề cần nhấn mạnh ở đây là: Đâu là phương pháp tìm kiếm bảo mật nhất ? Phương pháp phải ngăn ngừa SQL injection.
SQL injection: có thể hiểm ngắn gọn là việc người dùng truy vấn những dữ liệu nhạy cảm trong cơ sở dữ liệu của Website thông qua Request URL nhập vào thanh địa chỉ của trình duyệt.

Cách 1: sử dụng phương thức where.
- Vào mode console trong Rails: $ rails console
>> Article.where(:title => 'Advanced Active Record')
Ta đã biết Model Article sẽ map với Database Table tên articles, câu truy vấn trên sẽ lọc dữ liệu trong Table article trên tất cả các dòng ( Row ) mà trường title có tên là Advanced Active Record.

Cách 2: sử dụng SQL Fragment
>> Article.where("title = 'Advanced Active Record'") # tương tự cách 1.
>> Article.where("created_at > '23-03-2010' OR body NOT LIKE '%model%'")
Dòng lệnh trên tìm kiếm trong Database Table article các dòng dữ liệu thoả mãn đồng thời 2 điều kiện.

  1. Trường created_at có ngày tháng năm sau ngày 23-03-2010.
  2. Trường body chứa nội dung trong đó có chữ model.

Ghi chú: % còn gọi là ký hiệu widecard, đại điện cho bất kỳ ký tự nào dứng trước vào sau từ model.

Cách 3: Using an Array Condition Syntax ( là cú pháp chuỗi điều kiện )
Đây là phương pháp mà RoRs kiến nghị chúng ta sử dụng để chống lại SQL injection và các malicious user:
>> Article.where("published_at < ?", Time.now)

>> Article.where("published_at < ?", Time.now).to_sql => "SELECT \"articles\".* FROM \"articles\"
WHERE (published_at < '2010-05-02 16:27:51.059277')"


>> Article.where("created_at = ?", Article.last.created_at)

>> Article.where("created_at = ? OR body LIKE ?", Article.last.created_at, 'model')

Các bạn có thể thay thế dấu "?" bằng một tham số biến nào đó, sau đó dùng một array để định nghĩa các biến theo các cặp :key => 'key_value'. Ưu điển cùa cách này giúp bạn không cần bận tâm thứ tự các điều kiện cũng như có rút gọn chuỗi tìm kiếm nếu như một điều kiện được lặp lại nhiều lần.

>> Article.where("title LIKE :search OR body LIKE :search",
{:search => '%association%'})

Cách 4: Tìm kiếm theo một chuỗi phương thức liên kết ( Association Proxies ) dưới sự hỗ trợ của Active Record
>> User.first.articles.all
>> current_user.articles.create(:title => 'Private', :body => ‘Body here..’)
Một số Method hữu ích khác của Active Record:
where(conditions); order; limit; joins; includes
Ví dụ ta có Model Article đã được tạo trong RoRs
Article.where("title =
'Advanced Active Record'")

Article.order("published_at
DESC")

Article.limit(1)

Article.joins(:comments)

Article.includes(:comments)

Không có nhận xét nào:

Đăng nhận xét