Rails - объединение активных записей отношений - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь выполнить https://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-the-joined-tables

У меня есть класс ImageCollection, статус которого может быть «активным».Этот класс принадлежит одному образу, который имеет атрибут с именем 'workflow_state'.

У меня есть следующее, которое работает, но выполнение занимает несколько секунд:

def self.published
  where(status: STATUS_ACTIVE).select { |x| x.image.workflow_state == Publishable::Meta.published_key }
end

Следующее не работает:

scope :published, lambda {
  where(status: STATUS_ACTIVE).joins(:image).where(
    'image.workflow_state = ?', Publishable::Meta.published_key
  )
}

И возвращает:

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'image.workflow_state' in 'where clause': SELECT  `image_containers`.* FROM `image_containers` INNER JOIN `images` ON `images`.`id` = `image_containers`.`image_id` WHERE `image_containers`.`status` = 'active' AND (image.workflow_state = 'published') ORDER BY `image.containers`.`id` ASC LIMIT 1

Я запутался, так как в таблице изображений есть workflow_state

Любая помощь очень ценится

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

У меня есть следующее, которое работает, но для его выполнения требуется несколько секунд:

Запрос из метода self.published выбирает все записи с status: STATUS_ACTIVE, а затем сканирует полученный массиввыбирая те, которые дали image.workflow_state.Таким образом, он получает результаты, которые будут выброшены с select, что является пустой тратой ресурсов.Что еще хуже, для каждой строки он создает объект ActiveRecord и делает дополнительный запрос к базе данных, чтобы получить ее image связь.Это печально известная N + 1 проблема с шаблоном .

Чтобы исправить это, вам нужно переписать ваш запрос как

  joins(:image).where(status: STATUS_ACTIVE, images: { workflow_state: Publishable::Meta.published_key } )
0 голосов
/ 09 октября 2018

Если вы используете обычный sql, вы должны использовать множественные имена таблиц.

Изменить: image.workflow_state на images.workflow_state

...