2012-05-25 17 views
9

En Rieles, tengo un modelo Product. A veces necesito obtener múltiples products al mismo tiempo (pero la lista es completamente dinámica, por lo que no se puede hacer en el lado de Rails).Rieles Obtenga Múltiple por ID

Entonces, digamos que para esta llamada necesito obtener los productos 1, 3, 9, 24 en una llamada. es posible? Si es así, ¿necesito una ruta personalizada para esto y qué pongo en mi controlador?

es decir, ¿algo así funciona? /products/1,3,9,24

+0

¿Está hablando del nivel de controlador/solicitud o el nivel de modelo/base de datos? – x1a4

+0

Tendrás que explicar un poco más. ¿A qué te refieres con "no se puede hacer por el lado de Rails"? – tybro0103

+0

@ x1a4 sí, el nivel de controlador/solicitud. Déjame editar. – Baub

Respuesta

24

No creo que deba cambiar las rutas. Debería simplemente analizarlos en su controlador/modelo.

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

Si a continuación, envía una solicitud a http://localhost/products/1,3,9,24, @products volviesen 4 registros.

+1

¡Esto funciona! :) Gracias. – Baub

+0

¡Gracias la solución! –

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

Esto funciona, pero la ruta no es necesaria. – Baub

+1

Es importante tener en cuenta que su comodín lo capta todo, por lo que si envía una solicitud a/products/1,2,3,4/edit, params [: ids] contendrá '1,2,3,4/edit' –

+0

y sabes que está bien si lo colocas al final –

5

Me parece que es una solicitud de índice con un alcance limitado, como una especie de búsqueda, por lo que yo haría:

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

y luego enlazar a este con una matriz url:

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

esto crea la matriz url no indexada estándar que se ve un poco como

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

Espero que ayude.

+0

Totalmente de acuerdo. Procesar esta solicitud con la acción 'index' probablemente se ajuste mejor con el resto de la lógica del controlador. – colllin

Cuestiones relacionadas