2017-11-28 1 views
1

Ich habe ein Order-Modell in meiner Ruby on Rails-Anwendung, die mehrere Attribute hat. Ich möchte diese Bestellungen nach Parametern abfragen, die von Benutzern wie itemCount, totalPrice und created date angegeben wurden.Ruby, aktives Modell dynamisch abfragen

Wenn eines dieser Attribute gegeben ist, ich meine es nicht Null ist, muss ich Modell abfragen, indem Sie es.

Ich kann so etwas tun:

if params[:totalPrice] and params[:itemCount] and params[:created_date] 
    @product = Product.where(totalPrice: params[:totalPrice],itemCount: params[:itemCount],created_date: params[:created_date]) 
elsif params[:totalPrice] and params[:itemCount] 
    @product = Product.where(totalPrice: params[:totalPrice],itemCount: params[:itemCount]) 
elsif params[:totalPrice] and params[:created_date] 
    @product = Product.where(totalPrice: params[:totalPrice],created_date: params[:created_date]) 
elsif params[:itemCount] and params[:created_date] 
    @product = Product.where(itemCount: params[:itemCount],created_date: params[:created_date]) 
elseif ....(and continues) 

Ich kann aber nicht darüber sicher sein. Vielleicht gibt es dort einen "Ruby" Weg, um dieses Problem zu lösen.

Was ist die beste Praxis zu tun,

Dank.

+0

Vielleicht nicht eine exakte Kopie, aber nahe genug IMO. –

Antwort

4

können Sie die Kette, die verschiedenen Bereiche mit Active:

@products = Product.all 
@products = @products.where(totalPrice: params[:totalPrice]) if params[:totalPrice] 
@products = @products.where(itemCount: params[:itemCount]) if params[:itemCount] 
@products = @products.where(created_date: params[:created_date]) if params[:created_date] 
# etc... 

Und dies leicht dynamisch sein kann (aber weiß gelistete):

filterable_columns = %i(itemCount totalPrice created_date) 
@products = Product.all 
filterable_columns.each do |column| 
    @products = @products.where(column => params[column]) if params[column] 
end 
+0

Das scheint großartig zu sein, zumindest nach meiner if-else-Lösung. Kann ich den Willenspaginate-Edelstein mit Ihrer kettenbasierten Lösung verwenden? –

+0

Ja, ActiveRecord :: Relation (wird im Grunde von 'Where'-Aufrufen zurückgegeben) erlaubt Ihnen, Chain-Scoping durchzuführen, indem Sie entweder mehrere in Ihrem Modell definierte Bereiche oder Ihre eigenen benutzerdefinierten' where' aufrufen (wie in dieser Antwort)). will-paginate arbeitet entweder mit einer AR :: Relation oder einem Array, wenn ich mich richtig erinnere. – MrYoshiji