gpt4 book ai didi

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

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

总结

非常感谢您的帮助。我有一个 locationsads 表。位置 has_many :ads

我想查询 Location 模型与 Ad 模型的 join ,以过滤 参数的条目位置广告

@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>

更新

  1. 第一期 - 解决自 Péter Tóth

解决方案。使用 .includes(:ads) 不使用 @locations[0].ads 重新执行查询。

@locations = Location.joins(:ads).where(locations: {id: 1}, ads: {id: 1})

问题是,当我从 ads 位置选择时,它将再次执行查询并删除之前的过滤器 ads.id = 1。

@locations[0].ads

结果是不仅 id=1 的广告将被选中,而且 @location[0] 的所有广告都将被选中。

  1. 第二期

我能够执行查询:

@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)

但这可以通过以下方式解决:对 Location 执行第一个查询

@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)

希望对您有所帮助!

关于ruby-on-rails - 表格和 .where() 条件之间的 Rails .joins(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42747210/

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