Đầu tiên, tôi đặc biệt khuyến khích bạn chuyển logic của Mô hình thành Mô hình. Thay vì tạo logic tìm kiếm vào Bộ điều khiển, hãy tạo phương thức #search vào chế độ Trích dẫn của bạn.
class Quote
def self.search(query)
...
end
end
và bộ điều khiển của bạn trở thành
# receives a string, splits it in a array of words, create the 'conditions'
# query, and send it to ActiveRecord
def search
@quotes = Quote.search(params[:query])
end
Bây giờ, trở lại vấn đề ban đầu. Logic tìm kiếm hiện tại của bạn mắc một lỗi rất nặng:nó nội suy trực tiếp giá trị mở mã của bạn vào SQL injection. Giả sử bạn sử dụng Rails 3, bạn có thể tận dụng cú pháp #where mới.
class Quote
def self.search(query)
words = query.to_s.strip.split
words.inject(scoped) do |combined_scope, word|
combined_scope.where("quote LIKE ?", "%#{word}%")
end
end
end
Đó là một chút chủ đề nâng cao. Tôi bạn muốn hiểu combined_scope
là gì + inject
không, tôi khuyên bạn nên đọc bài viết The Skinny on Scopes
.