2013-04-06 24 views

Trả lời

49

đây thử điều này, chọn ví dụ ..:

query = "select ...." 
results = ActiveRecord::Base.connection.execute(query) 
+1

Dường như điều này không được dùng nữa khi gọi điều này từ bộ điều khiển. Chú ý: #connection không được dùng để truy cập nó thông qua lớp.' – Vortico

+1

điều này là do bạn nên để mô hình tương tác với cơ sở dữ liệu thay vì truy cập cơ sở dữ liệu trực tiếp trong bộ điều khiển – ant

+0

@ant Tôi nên mở giao dịch hoặc mở kết nối đủ để thực hiện truy vấn sql tùy chỉnh? [pastie example] (http://pastie.org/10111824) – gaussblurinc

10

Trong Rails 4 (có lẽ phiên bản trước cũng), nếu bạn đang đi với một truy vấn tùy chỉnh cho tốc độ, bạn có thể thêm một đối số :skip_logging để tránh phải viết vào nhật ký:

query = "SELECT ..." 
results = MyModel.connection.execute(query, :skip_logging) 

(Lưu ý: Nếu tôi đang đọc những nguồn chính xác, điều này có thể không giữ đúng trong PostgreSQL.)

+0

làm cách nào để ngăn chặn việc tiêm SQL? – yeyo

+5

sẽ tự tạo ra một câu hỏi tuyệt vời (trừ khi nó đã được trả lời) - bạn có đồng ý không? –

+0

Vâng, tôi tin bạn nói đúng. – yeyo

26

Chỉ cần thêm mười xu của tôi, một nguyên truy vấn bằng cách sử dụng Model.connection.execute sẽ không trả về một mô hình ActiveRecord - nó sẽ trả về một tập dữ liệu thô.

Sau đây sẽ trở lại mô hình ActiveRecord:

MyModel.find_by_sql(query) 

chỉnh sửa: giả sử tất nhiên rằng bạn đang chạy một lựa chọn.

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