2013-01-05 26 views
6

Tôi đang cố gắng xây dựng một trang kết quả tìm kiếm trong ứng dụng đường ray của tôi (vẫn còn là một noob) và tôi không thể tìm ra cách để xây dựng một truy vấn đường ray.Làm cách nào bạn có thể xây dựng một truy vấn ActiveRecord trong Rails một cách có điều kiện?

Ví dụ: nếu không có tham số nào, tôi muốn trả về tất cả kết quả. Nếu người dùng chuyển 1 đến n tham số tùy chọn trong biểu mẫu tìm kiếm, tôi muốn thêm chúng vào truy vấn.

Tiếp theo nếu chúng có loại "giá desc" hoặc "year_built desc" hoặc thậm chí là kết hợp cả hai.

Cuối cùng sử dụng will_paginate để tách các kết quả

# default to all listings 
@listings = Mls.all 

@listings.where("listing_price > ?", params[:listing_price]) unless params[:listing_price].blank? 
# ... bunch of other search options ... 
@listings.where("property_type = ?", params[:property_type]) unless params[:property_type].blank? 

# order 
@listings.order("some order by param") if some sort param 
@listings.order("some order by param") if some other sort param 

# paginate results 
@listings.paginate(:page => params[:page]) 

Có một "Rails" cách để làm điều này?

+1

bạn nên mã hóa một vòng lặp và phạm vi – apneadiving

+0

Tôi không biết nếu đây là thực sự là một câu trả lời cho câu hỏi nhưng [has_scope] (https://github.com/plataformatec/has_scope) giải quyết vấn đề của tôi khá gọn gàng. –

Trả lời

21

Bạn đã nhìn thấy (sửa đổi) Railscasts tập về tìm kiếm nâng cao? Dưới đây là liên kết: http://railscasts.com/episodes/111-advanced-search-form-revised

Ý tưởng cơ bản là tạo ra một nguồn lực Search rằng sẽ xử lý params tìm kiếm được gửi trong thông qua các hình thức và trong tìm kiếm nền trên mô hình trong câu hỏi (trong trường hợp của bạn Mls)

Bằng cách đó, thay vì kiểm tra trong bộ điều khiển cho sự hiện diện của các thông số nhất định (ví dụ params[:listing_price]), bạn có thể nắm được tình hình trong mô hình tìm kiếm (mô hình/search.rb):

def find_listings 
    listings = Mls.order(:name) 
    listings = listings.where("listing_price > ?", listing_price) if listing_price.present? 
    # ... more condition checking 
    listings 
end 
+0

tôi thích điều đó, thx – Batman

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