gpt4 book ai didi

ruby-on-rails - 有条件地链接范围的最佳方法

转载 作者:数据小太阳 更新时间:2023-10-29 06:55:49 24 4
gpt4 key购买 nike

我正在尝试扩展服务器端数据表的功能。我将一些额外的过滤器传递到我的 Controller /数据表,我用它来过滤结果。目前在我的模型中,我在应用我的范围之前测试参数是否存在,但我不相信这是最好的方法,因为当我的过滤器列表增长时,我会有很多 if/else 场景。我怎样才能以“rails 方式”做到这一点?

if params[:store_id].present? && params[:status].present?
Order.store(params[:store_id]).status(params[:status])
elsif params[:store_id].present? && !params[:status].present?
Order.store(params[:store_id])
elsif !params[:store_id].present? && params[:status].present?
Order.status(params[:status])
else
Order.joins(:store).all
end

回答:将答案合并到此工作代码中:

query = Order.all
query = query.store(params[:store_id]) if params[:store_id].present?
query = query.status(params[:status]) if params[:status].present?
query.includes(:store)

最佳答案

你可以这样做:

query = Order
query = query.store(params[:store_id]) if params[:store_id].present?
query = query.status(params[:status]) if params[:status].present?
query = Order.joins(:store) if query == Order

或者,您也可以重组 statusstore 范围以将条件包含在内:

scope :by_status, -> status { where(status: status) if status.present? }

然后你可以这样做:

query = Order.store(params[:store_id]).by_status(params[:status])
query = Order.joins(:store) unless (params.keys & [:status, :store_id]).present?

关于ruby-on-rails - 有条件地链接范围的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38136110/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com