2010-04-24 17 views
5

G'day guys, tôi đang gặp sự cố với việc lọc bản trình bày của hàng nghìn thương phẩm tôi có trong hệ thống của mình. Theo thông số kỹ thuật của hệ thống chúng tôi đang xây dựng, chúng tôi phải có một biểu mẫu cho phép mọi người đưa vào ngày bắt đầu và sau đó một khoảng thời gian tính bằng phút, để lọc bản trình bày của các mục. Tôi đã xây dựng các hàm trợ giúp của mình để trả về tất cả các giao dịch trong khoảng thời gian đó, nhưng tôi không thể cho cuộc sống của tôi xây dựng đúng biểu mẫu sẽ trả về giá trị ngày giờ và giá trị số nguyên trong đầu trang chỉ mục?Xây dựng biểu mẫu đường ray để lọc trang chỉ mục?

Bất kỳ ý tưởng nào? Tôi có phải xây dựng một đối tượng mô hình riêng biệt để gán các giá trị cho, hoặc là có một cách đơn giản hơn?

Trả lời

16

Trên trang index của bạn, bạn có thể tạo ra một hình thức lọc như thế này

<%= form_tag '', :method => :get do %> 
    <%= text_field_tag :value_one %> 
    <%= text_field_tag :value_two %> 
    <%= submit_tag 'Filter' %> 
<% end %> 

hình thức của bạn sau đó sẽ làm một GET trên trang của bạn với các thông số chuỗi truy vấn và sau đó trong bộ điều khiển của bạn, bạn có thể tìm kiếm các thông số bộ lọc có thể đã được thông qua.

+2

Nếu bạn muốn ommit '& commit = Filter' từ URL bạn có thể viết' <% = submit_tag 'Bộ lọc', tên: nil%> '. –

2

Tôi thích từng bước xây dựng một bộ lọc trong bộ điều khiển của tôi, ví dụ:

def index 

    filter = [] 

    if params.has_key?("filter") 

    if !params[:filter][:user_id].blank? 
     id = params[:filter][:user_id] 
     filter << ["user_id = #{id.to_i}"] 
    end 

    if !params[:filter][:project_id].blank? 
     id = params[:filter][:project_id] 
     filter << ["project_id = #{id.to_i}"] 
    end 

    if !params[:filter][:change_type_id].blank? 
     id = params[:filter][:change_type_id] 
     filter << ["change_type_id = #{id.to_i}"] 
    end 

    end 

    @logs = LogEntry.where(filter.join(" AND ")).order('created_at DESC')  

end 

Nếu không có bộ lọc được chọn theo quan điểm của bạn (tôi sử dụng helper select_tag mẫu), truy vấn DB của bạn sẽ trả lại toàn bộ hồ sơ.

+1

Tôi thích cách tiếp cận này (đó là phần thứ hai của câu trả lời cho câu hỏi!). Có lẽ thay vì '! Params [...]. Blank?' Nó hơi đẹp hơn với 'params [...]. Present?'. –

+4

Thực ra bạn không phải dần dần xây dựng một bộ lọc như thế này, thay vào đó bạn nên dần dần xây dựng một truy vấn bản ghi hoạt động bằng cách gọi câu lệnh where cho các điều kiện khác nhau để thu hẹp dần bộ kết quả. Rails đủ thông minh để thực hiện tất cả trong một câu lệnh ngay cả khi bạn có nhiều cuộc gọi đến mô hình LogEntry. – Noz

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