当前位置 : 主页 > 编程语言 > ruby >

ruby-on-rails – 表之间的Rails .joins()和.where()条件

来源:互联网 收集:自由互联 发布时间:2021-06-23
摘要 非常感谢你的帮助. 我有一个位置和广告表.位置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)

希望有所帮助!

网友评论