Запросите список записей с ActiveRecord, где внешние ключи каждого элемента присутствуют в хэше - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть четыре модели: пользователь, агентство, листинг и запрос.

пользователь has_one агентство, агентство has_many листинги и листинг has_many запросы.

У меня есть запрос, где я получаю :user_id, поэтому я могу получить его Агентство и коллекцию списков.

Мне нужны запросы, относящиеся к определенному листингу.

Мой подход следующее, очевидно, я ищу замену для all. Я хотел бы сделать запрос, где я могу перечислить все запросы, где :listing_id - это идентификатор одного из списков в @listings.

  def index
    @agency = User.find(params[:user_id]).agency
    @listings = @agency.listings

    @inquiries = Inquiry
      .all

    render json: @inquiries
  end

Я пытался объединить различные select, includes, where, et c. методы, но не могли найти рабочее решение.

Спасибо за вашу помощь, очень признателен!

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Мы можем использовать многократные объединения в одном запросе, чтобы достигнуть полученной ассоциации.

def index
  @inquiries = Inquiry.joins(listing: { agency: :user }).where(users: { id: params[:user_id] })

 render json: @inquiries
end
0 голосов
/ 25 апреля 2020

Прежде всего, если вы используете что-то вроде RuboCop, он, вероятно, предупредит вас, что вы обычно передаете только одну, возможно две переменные экземпляра в методе, подобном этому. Не то чтобы я этого не делал, просто он не рассматривает оптимальные Rails. Тем не менее:

Один из способов может быть таким:

def index
  @agency = User.find(params[:user_id]).agency
  @listings = @agency.listings

  @inquiries = Inquiry.where(listing_id: @listings.pluck(:id))

 render json: @inquiries
end

Вы можете передать массив вещей для сопоставления с where. pluck дает вам массив всех когда-либо переданных вам столбцов.

...