ruby-on-rails – 表之间的Rails .joins()和.where()条件
摘要
非常感谢你的帮助. 我想通过广告模型的连接查询位置模型,以过滤位置和广告参数的条目. @locations = Location.joins(:ads).where(locations: location_params,ads: location_params[:ads_attributes]) 这是location_params方法(将使用另一种正常工作的方法删除空字段). params.require(:location).permit(:country,{:ads_attributes => [:remote,:days]}) 这是我的查询的一个例子.我有一个方法从location_params中删除空字段.它工作正常. SELECT "locations".* FROM "locations" INNER JOIN "ads" ON "ads"."location_id" = "locations"."id" WHERE "ads_attributes"."remote" = $1 [["remote","1"]] 在这种情况下,location_params具有以下字段: <ActionController::Parameters {"ads_attributes"=> <ActionController::Parameters {"remote"=>"1"} permitted: true>} permitted: true> 这就是结果,即使我在表格中有这些参数的条目,也是一个空对象 #<Location::ActiveRecord_Relation:0x3fb83def8190> 更新 >第一期 – 从Péter Tóth解决 解.使用.includes(:ads)不使用@locations [0] .ads重新执行查询. @locations = Location.joins(:ads).where(locations: {id: 1},ads: {id: 1}) 问题是,当我从广告位置中选择时,它会再次执行查询并删除之前的过滤器ads.id = 1. @locations[0].ads 结果是,不仅会选择ID = 1的广告,而且会选择该@location [0]的所有广告. >第二期 我能够执行查询: @locations = Location.joins(:ads).where(locations: {id: 1},ads: {id: 1}) 要么 @locations = Location.joins(:ads).where(location_params) 但不是 @locations = Location.joins(:ads).where(locations: location_params,ads: ads_params) 但这可以解决如下: @locations = Location.joins(:ads).where(@location_params.require(:location).permit(:id)).includes(:ads) 返回包含这些参数的所有位置,然后我需要根据广告过滤器过滤@locations.问题是我无法执行以下查询. @locations = @locations.joins(:ads).where(ads: @ads_params.require(:ads).permit(:id)).includes(:ads) 解决方法
您需要重写查询,因为ads_attributes不是表,请尝试此操作
ads_params = @ads_params.require(:ads).permit(:id).to_h location_params = @location_params.require(:location).permit(:id).to_h @locations = Location.joins(:ads).where(locations: location_params,ads: ads_params) 希望有所帮助! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |