Ruby,动态查询活动模型

时间:2017-11-28 22:15:39

标签: ruby-on-rails ruby activerecord rails-activerecord

我的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”方式来解决这个问题。

这样做的最佳做法是什么,

感谢。

1 个答案:

答案 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