摘要 非常感谢你的帮助. 我有一个位置和广告表.位置has_many:广告 我想通过广告模型的连接查询位置模型,以过滤位置和广告参数的条目. @locations = Location.joins(:ads).where(locations: location
非常感谢你的帮助.
我有一个位置和广告表.位置has_many:广告
我想通过广告模型的连接查询位置模型,以过滤位置和广告参数的条目.
@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)
希望有所帮助!