gpt4 book ai didi

sql - Rails ActiveRecord where 子句

转载 作者:数据小太阳 更新时间:2023-10-29 07:32:00 25 4
gpt4 key购买 nike

我想使用 where 子句从数据库中选择 Cars,为我的问题寻找最佳 DRY 方法。

例如我有这两个参数

params[:car_model_id] (int)
params[:transmission_id] (int)
params[:from_date]
params[:to_date]

但我不知道哪个会是null

if params[:car_model_id].nil? && !params[:transmission_id].nil?
if params[:from_date].nil? && params[:from_date].nil?
return Car.where(:transmission_id => params[:transmission_id])
else
return Car.where(:transmission_id => params[:transmission_id], :date => params[:from_date]..params[:to_date])
end
elseif !params[:car_model_id].nil? && params[:transmission_id].nil?
if params[:from_date].nil? && params[:from_date].nil?
return Car.where(:car_model_id=> params[:car_model_id])
else
return Car.where(:car_model_id=> params[:car_model_id], :date => params[:from_date]..params[:to_date])
end
else
return Car.where(:car_model_id=> params[:car_model_id], :transmission_id => params[:transmission_id], :date => params[:from_date]..params[:to_date])
end

避免此类错误代码并检查参数是否为 nil inline(在 where 中)的最佳方法是什么

最佳答案

你可以这样做:

car_params = params.slice(:car_model_id, :transmission_id).reject{|k, v| v.nil? }

然后:

Car.where(car_params)

解释: 因为,您正在检查特定 key ,即::car_model_idtransmission_id 是否存在于 params。当你在 params 中只有 :transimission_id 时,上面的代码会是这样的:

Car.where(:transmission_id => '1')

或者当您在 params 中有 :car_model_id 时:

Car.where(:car_model_id => '3')

或者当你同时拥有两者时:

Car.where(:transmission_id => '1', :car_model_id => '3')

注意:只有当您将 params 键作为您尝试对其运行查询的列名时,这才会起作用。如果您打算在 params 中有一个与列名不匹配的不同键,那么我建议您在 slice 之前将它的键更改为 Controller 本身中的列名>.

更新:从那以后,OP 编辑​​了他的问题并引入了更多 if.. else 条件。解决这个问题并始终牢记一件事的一种方法是让你的 user_params 正确值,你想在模型类上运行你的查询,这里是 Car。所以,在这种情况下:

car_params = params.slice(:car_model_id, :transmission_id).reject{|k, v| v.nil? }
if params[:from_date].present? && params[:from_date].present?
car_params.merge!(date: params[:from_date]..params[:to_date])
end

然后:

Car.where(car_params)

关于sql - Rails ActiveRecord where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26147490/

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