Игнорирование определенного поля при запросе в Rails и ActiveRecord

Я знаю, что могу указать определенные поля для запроса базы данных с помощью pluck.

ids = Item.where('due_at < ?', 2.days.from_now).pluck(:id)

Однако я хотел бы знать, есть ли способ указать определенные поля, которые я хотел бы избежать при запросе из базы данных. Какой-то антипригар?

  posts = Post.where(published: true).do_not_lookup(:enormous_field)

person The Whiz of Oz    schedule 03.03.2015    source источник
comment
Item.where('due_at ‹ ?', 2.days.from_now).map{|a| a.attributes.except!(email, id).values}   -  person user3118220    schedule 03.03.2015


Ответы (1)


Model#attribute_names должен возвращать массив столбцов/атрибутов. Вы можете исключить некоторые из них и перейти к методам pluck или select.

Что-то вроде этого:

posts = Post.where(published: true).select(Post.attribute_names - ['enormous_field'])
person Maxim    schedule 03.03.2015
comment
pluck намного быстрее, чем select - guides.rubyonrails.org/active_record_querying.html#pluck - person Anthony; 03.03.2015
comment
Не совсем, pluck использует select под капотом, он просто возвращает результаты как массив, а select как записи. - person tompave; 03.03.2015
comment
@tompave, эти ребята не согласны. более чем на 90 % удаление выполняется быстрее: gavinmiller.io/2013/getting- знать-выбирать-и-выбирать - person The Whiz of Oz; 03.03.2015
comment
Pluck как минимум в 3 раза быстрее, но вы получаете массив, а не объекты активной записи. - person John Naegle; 03.03.2015
comment
pluck быстрее, потому что он извлекает определенные столбцы из БД, затем останавливается и напрямую возвращает их в виде массива. select, с другой стороны, выполнит тот же запрос, что и pluck, но вернет ActiveRecord::Relation. Затем это отношение можно преобразовать в массив полноценных записей. Медленная часть - это преобразование в ActiveRecord::Base - person tompave; 03.03.2015