2010-12-29 30 views
10

Vì lý do hiệu suất, tôi cần phải viết một phương pháp mới trong mô hình Rails của tôi mà thực hiện một số SQL tùy ý:Làm thế nào để thực hiện SQL tham số tùy ý trong đường ray

UPDATE table 
    SET col1 = ? AND col2 = ? 
    WHERE id = ? 

Tôi hiểu rằng tôi có thể sử dụng ActiveRecord::Base.connection.execute hoặc ActiveRecord::Base.connection.update với một chuỗi của SQL để có được kết quả mà tôi cần, nhưng thủ tục thích hợp để thay thế trình giữ chỗ tham số (?) bằng các giá trị tham số thực tế là gì? Có một phương pháp Rails cho các tham số nội suy vào một câu lệnh SQL, hay nó chỉ nên được thực hiện bằng nội suy thủ công? Sau đó dường như không an toàn ...

+2

Kiểm tra câu hỏi này cũng: http://stackoverflow.com/questions/4483049/how-to-execute-a-raw-update-sql-with-dynamic-binding-in-rails/4484549#4484549. –

+0

Tôi nhận xét thứ hai của Brian - liên kết ở trên dường như là cùng một câu hỏi cơ bản. –

Trả lời

7

Bạn cũng có thể làm điều này:

updates = ActiveRecord::Base.send(:sanitize_sql_array, ["name = ? and category = ?", name, category]) 
ActiveRecord::Base.connection.execute("update table set #{updates} where id = #{id.to_s.to_i}") 

to_s đang được kêu gọi id trước to_i trong trường hợp đó là con số không.

+0

Điều này là không trả lời câu hỏi, vì nó sử dụng nội suy chuỗi và do đó vunerable để tiêm SQL. Có, tôi biết nó sử dụng mảng sql "đã được vệ sinh", nhưng có một lịch sử lâu dài về những thứ này là một sự thay thế kém cho an ninh thực tế. Những gì đang được yêu cầu là truy cập vào các truy vấn được tham số hóa như tất cả các hệ thống dbms sane đã có từ những năm 1980. – Shayne

0
Table.where(id:id).update_all(col1:val1, col2:val) 

Trừ khi tôi đã hiểu nhầm câu hỏi.

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