ActiveRecord .select(): возможно очистить старые выборки?

Есть ли способ очистить старые выборки в операторе.select("table.col1, ...")?

Фон:

У меня есть область, которая запрашивает доступные элементы для данного идентификатора пользователя (упрощенно)

    scope :accessible, lambda { |user_id|
  joins(:users).select("items.*")
    .where("items_users.user_id = ?) OR items.created_by = ?", user_id, user_id)
}

Тогда, например, в действии index мне нужны только идентификатор элемента и заголовок, поэтому я бы сделал это:

@items = Item.accessible(@auth.id).select("polls.id, polls.title")

Однако при этом будут выбраны столбцы "items. , Items.id, items.title". Я хотел бы избежать удаления выбора из области, так как тогда я должен был бы добавить выбор ("элементы. ") Повсюду. Правильно ли я предполагаю, что нет способа сделать это, и я либо вынужден извлекать слишком много полей, либо мне приходится использовать несколько областей?

1 ответ

Решение

К счастью, вы не правы:D, вы можете использовать #except метод для удаления некоторых частей запроса, сделанного отношением, поэтому, если вы хотите удалить часть SELECT, просто выполните:

@items = Item.accessible(@auth.id).except(:select).select("polls.id, polls.title")

повторно выбрать (Rails 6+)

Rails 6 представил новый метод под названием reselect, который делает именно то, что вам нужно, он заменяет ранее установленный select заявление.

Итак, теперь ваш запрос можно написать еще короче:

@items = Item.accessible(@auth.id).reselect("polls.id, polls.title")
Другие вопросы по тегам