2012-05-25 23 views
9

W Railsach mam model Product. Czasami potrzebuję uzyskać wiele wersji products w tym samym czasie (ale lista jest całkowicie dynamiczna, więc nie można tego zrobić po stronie Railsów).Szyny Pobierz wiele według ID

Tak więc, powiedzmy, że w tym wywołaniu muszę uzyskać produkty 1, 3, 9, 24 w jednym wywołaniu. czy to możliwe? Jeśli tak, czy potrzebuję niestandardowej trasy i co mam umieścić w kontrolerze?

tj. Czy coś takiego działa? /products/1,3,9,24

+0

Czy mówisz o poziomie kontrolera/żądania lub modelu/bazy danych? – x1a4

+0

Będziesz musiał wyjaśnić trochę więcej. Co masz na myśli mówiąc "nie da się zrobić po stronie Railsów"? – tybro0103

+0

@ x1a4 tak, poziom kontrolera/żądania. Pozwól mi edytować. – Baub

Odpowiedz

24

Nie sądzę, że powinieneś w ogóle zmienić trasę. Powinieneś po prostu sparsować je w kontrolerze/modelu.

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

Jeśli następnie wysłać wniosek do http://localhost/products/1,3,9,24, @products powinien powrócić 4 rekordy.

+1

To działa! :) Dzięki. – Baub

+0

Dzięki temu rozwiązaniu! –

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

Działa to, ale trasa nie jest potrzebna. – Baub

+1

Ważne jest, aby pamiętać, że symbol wieloznaczny przechwytuje wszystko, więc jeśli wyślesz żądanie do/products/1,2,3,4/edit, parametry [: identyfikatory] będą zawierały "1,2,3,4/edycja" –

+0

i wiesz, że to jest ok, jeśli umieścisz to w końcu –

5

uważam ten wniosek do indeksu o ograniczonym zakresie, tak jakby wyszukiwania, więc chciałbym zrobić:

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

a następnie połączyć to z tablicy URL:

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

tworzy standardowy nieindeksowane tablicę url, który wygląda trochę jak

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

nadzieję, że pomoże.

+0

Całkowicie się zgadzam. Przetwarzanie tego żądania za pomocą akcji "index" prawdopodobnie będzie pasować lepiej do reszty logiki kontrolera. – colllin

Powiązane problemy