Rails: Как упростить ".select (: my_field) .map (&: my_field)"? - PullRequest
1 голос
/ 09 ноября 2011

Чтобы получить номера счетов-фактур выбранных заданий, которые я делаю:

Job.where(...).map(&:invoice_number)

Поскольку номера счетов-фактур - это все, что мне нужно, я подумал добавить select(:invoice_number) (я предполагаю, что запрос SQL становится более эффективным таким образом):

Job.where(...).select(:invoice_number).map(&:invoice_number)

Есть ли лучший способ сделать то же самое?(часть .select(:invoice_number).map(&:invoice_number) мне кажется неэффективной)

Ответы [ 4 ]

2 голосов
/ 09 ноября 2011

Вы всегда можете использовать select_values. Что-то похожее на:

Job.connection.select_values(Job.where(...).select(:invoice_number).to_sql)

Это позволяет избежать создания экземпляров объектов ActiveRecord.

1 голос
/ 20 января 2014

Я знаю, что этот вопрос довольно старый, но в случае, если кто-то еще проверит это, это может быть достигнуто с помощью pluck (http://apidock.com/rails/ActiveRecord/Calculations/pluck). Согласно http://edgeguides.rubyonrails.org/active_record_querying.html#pluck "pluck делает его можно заменить код вроде: Client.select(:id).map(&:id) на Client.pluck(:id) "

0 голосов
/ 09 ноября 2011

Вы можете использовать GROUP_CONCAT .

invoice_numbers = Job.where(...).select('group_concat(invoice_number) as invoice_numbers').
                    first.invoice_numbers.split(',').map(&:to_i)

Этот подход слишком длинный и не очень очевидный, но он будет работать быстрее, чем

Job.where(...).select(:invoice_number).map(&:invoice_number)
0 голосов
/ 09 ноября 2011

Хотелось бы оказаться неправым, но .. Я не думаю, что это возможно

Поскольку все активные методы записи являются цепочечными, метод, который вернул массив строк, сломал бы это. Если бы такой метод существовал, то он не был бы в AR, я не могу думать о том, где еще искать ..

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