Резюме
Большое спасибо за твою помощь. У меня есть таблица locations
и ads
. Местоположение has_many :ads
Я хотел бы сделать запрос модели Location
с моделью join
с моделью Ad
, чтобы отфильтровать записи по параметрам 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})
Or
@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)
{ country: location_params[:country] }
. Есть несколько полей и есть метод, который удаляет их, если они пусты. Еслиlocation_params[:country]
пусто, то оно будет удалено и станетnil
. Я хотел бы просто ввестиlocation_params
в запрос, не указывая конкретный столбец для выбора. Знаете ли вы, как исправить следующий запрос, чтобы он работал?@locations = Location.joins(:ads).where(locations: new_params, ads: new_params[:ads_attributes])
Спасибо 12.03.2017<ActionController::Parameters {"country"=>"IT", "location"=>"Leizpig"} permitted: true>
, а это ads_params<ActionController::Parameters {"remote"=>"1"} permitted: true>
и запрос пустой#<Location::ActiveRecord_Relation:0x3f9eeac68e00>
12.03.2017