我的ruby on rails应用程序中有一个Order模型,它有几个属性。我想根据用户给出的参数查询这些订单,例如itemCount,totalPrice和创建日期。
如果给出其中一个属性,我的意思是它不是零,我需要使用它来查询模型。
我可以做类似的事情:
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)
然而,我无法确定。也许有一种“Ruby”方式来解决这个问题。
这样做的最佳做法是什么,
感谢。
答案 0 :(得分:5)
您可以使用ActiveRecord链接不同的范围:
@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...
这很容易动态(但列入白名单):
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