Фильтрация объектов путем проверки наличия нескольких записей в таблице «многие ко многим» - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть три таблицы: listings, amenities и listing_amenities. У меня есть фильтр, в котором пользователи могут фильтровать списки по удобствам, и в моем контроллере я принимаю их фильтр как массив amenity описаний. Я пытаюсь отфильтровать списки, в которых есть ВСЕ эти amenities. В настоящее время я могу фильтровать, но он только проверяет, есть ли у listings хотя бы ОДИН из предоставленных amenities.

Текущий запрос:

  scope :filter_by_amenities, ->(amenities) { # amenities is array of descriptions
    includes(:listing_amenities)
      .where(listing_amenities: {
               :amenity_id => (
                 Amenity.where(:description => amenities)
               )
             })
  }

Как я могу изменить запрос, чтобы он возвращал только списки, в которых есть ВСЕ удобства, а не хотя бы один?

1 Ответ

0 голосов
/ 05 апреля 2019

Это можно сделать с помощью метода класса и итеративного запроса результирующих записей.

  def self.filter_by_amenities(amenities)
    amenity_ids = Amenity.where(:description => amenities).pluck(:id)
    records = self.all
    amenity_ids.each do |amenity_id|
      record_ids = records.includes(:listing_amenities).where(listing_amenities: {:amenity_id => amenity_id)}).pluck(:id)
      records = records.where(id: record_ids)
    end  
    records
  end

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...