2009-01-01 20 views
5

Tôi khá mới với Rails và tôi đã tò mò về một số các chuyên gia quy ước đang sử dụng khi họ cần xây dựng một truy vấn SQL rất phức tạp có chứa nhiều điều kiện. Cụ thể, giữ mã có thể đọc và duy trì được.Quy ước của bạn để chỉ định các truy vấn SQL phức tạp trong Rails là gì?

Có một vài cách tôi có thể nghĩ:

dòng Độc thân, trong cuộc gọi để tìm():

@pitchers = Pitcher.find(:all, "<conditions>") 

Sử dụng một chuỗi xác định trước và vượt qua nó trong:

@pitchers = Pitcher.find(:all, @conditions) 

Sử dụng chức năng thành viên riêng để trả lại truy vấn

@pitchers = Pitcher.find(:all, conditionfunction) 

Tôi sắp xếp dựa vào quy ước chức năng thành viên riêng tư, ngoài ra, vì bạn có thể chuyển các tham số để tùy chỉnh truy vấn.

Bất kỳ suy nghĩ nào về điều này?

Trả lời

7

Tôi hầu như không bao giờ chuyển điều kiện đến find. Thông thường, những điều kiện đó sẽ có giá trị để thêm vào mô hình đối tượng của bạn dưới dạng named_scope hoặc thậm chí chỉ là một phương thức lớp trên mô hình. Phạm vi được đặt tên là tốt đẹp bởi vì bạn có thể chuỗi chúng, mà phải mất một chút cắn ra khỏi sự phức tạp. Chúng cũng cho phép bạn truyền tham số.

Ngoài ra, bạn hầu như không bao giờ chỉ chuyển chuỗi điều kiện SQL thô. Bạn nên sử dụng kiểu băm (:conditions => { :name => 'Pat' }) hoặc kiểu mảng (['name = ?', 'Pat']). Bằng cách này, SQL được thoát cho bạn, cung cấp một số bảo vệ chống lại các cuộc tấn công SQL injection.

Cuối cùng, tôi nghĩ rằng cách tiếp cận bạn đang xem xét, nơi bạn đang cố tạo điều kiện trong bất kỳ ngữ cảnh nào bạn gọi find là một cách tiếp cận thiếu sót. Đây là công việc của mô hình để cung cấp một giao diện mà qua đó đáp ứng thích hợp được trả về. Việc cố gắng xác định các điều kiện để chuyển sang cuộc gọi find quá gần với việc triển khai cơ bản nếu bạn hỏi tôi. Thêm vào đó khó kiểm tra hơn.

+0

Nhận xét tuyệt vời, cảm ơn bạn! – unknownuser

+0

Rất vui được trợ giúp. Để tôi hỏi bạn điều này: Trong ngữ cảnh nào bạn gọi là 'tìm'? Bộ điều khiển? Mô hình khác? Tôi hy vọng không xem :) – nakajima

+0

Từ bộ điều khiển. Tôi đã làm hầu hết các phát hiện của tôi theo cách đó. Tôi sẽ xem xét đẩy họ vào mô hình. – unknownuser

Các vấn đề liên quan