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")