2012-05-25 27 views
9

Trong Rails, tôi có mô hình Product. Đôi khi tôi cần phải nhận được nhiều products cùng một lúc (nhưng danh sách là hoàn toàn năng động, vì vậy nó không thể được thực hiện ở bên Rails).Đường ray Nhận nhiều theo ID

Vì vậy, giả sử cuộc gọi này, tôi cần nhận các sản phẩm 1, 3, 9, 24 trong một cuộc gọi. Điều này có thể không? Nếu vậy, tôi có cần một tuyến đường tùy chỉnh cho điều này và tôi phải đặt gì trong bộ điều khiển của mình không?

tức là hoạt động như thế này? /products/1,3,9,24

+0

Bạn đang nói về cấp độ bộ điều khiển/yêu cầu hoặc cấp mô hình/cơ sở dữ liệu? – x1a4

+0

Bạn sẽ phải giải thích thêm một chút. Những gì bạn có nghĩa là "không thể được thực hiện ở phía Rails"? – tybro0103

+0

@ x1a4 có, trình điều khiển/mức yêu cầu. Hãy để tôi chỉnh sửa. – Baub

Trả lời

24

Tôi không nghĩ bạn cần thay đổi các tuyến đường. Bạn chỉ cần phân tích chúng trong bộ điều khiển/mô hình của bạn.

def show 
    @products = Product.find params[:id].split(',') 
end 

Nếu sau đó bạn gửi yêu cầu đến http://localhost/products/1,3,9,24, @products sẽ trả về 4 bản ghi.

+1

thì sẽ ổn thôi! :) Cảm ơn. – Baub

+0

Cảm ơn giải pháp! –

3
Product.where(:id => params[:ids].split(',')) 
+0

Công trình này hoạt động nhưng không cần đến tuyến đường. – Baub

+1

Điều quan trọng cần lưu ý là ký tự đại diện của bạn bắt được mọi thứ, vì vậy nếu bạn gửi yêu cầu đến/sản phẩm/1,2,3,4/chỉnh sửa, thông số [: id] sẽ chứa '1,2,3,4/chỉnh sửa' –

+0

và bạn biết rằng nếu bạn đặt nó vào cuối –

5

tôi sẽ xem xét việc này yêu cầu chỉ số với một phạm vi hạn chế, loại giống như một tìm kiếm, vì vậy tôi sẽ làm:

class ProductsController < ApplicationController 
    def index 
    @products = params[:product_ids] ? Product.find(params[:product_ids]) : Product.all 
    end 
end 

và sau đó liên kết đến đây với một mảng url:

<%= link_to 'Products', products_path(:product_ids => [1, 2, 3]) %> 

điều này tạo ra các mảng url không được lập chỉ mục tiêu chuẩn mà trông giống như

product_ids[]=1&product_ids[]=2 ... 

Hy vọng rằng sẽ giúp.

+0

Hoàn toàn đồng ý. Việc xử lý yêu cầu này bằng hành động 'index' có lẽ sẽ phù hợp hơn với phần còn lại của logic điều khiển. – colllin

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