【发布时间】:2017-03-12 12:12:09
【问题描述】:
总结
非常感谢您的帮助。
我有一个locations 和ads 表。位置has_many :ads
我想用join 和Ad 模型查询Location 模型,以过滤Location 和Ad 的参数条目。
@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 时,它会再次执行查询并删除之前的过滤器 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)
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-5