(по многочисленным просьбам, размещение в качестве реального ответа)
Что мне не нравится в решении fl00r , так это то, что оно создает новый объект User для каждой записи в БД; который просто не масштабируется. Это здорово для таблицы, в которой всего 10 писем, но как только вы начнете получать тысячи, вы столкнетесь с проблемами, в основном с потреблением памяти Ruby.
Эту небольшую проблему можно обойти, используя connection.select_values на модели и немного совершенства ARel:
User.connection.select_values(User.select("email").to_sql)
Это даст вам прямые строки адресов электронной почты из базы данных. Нет проблем с пользовательскими объектами, и он будет масштабироваться лучше, чем прямой User.select("email")
запрос, но я бы не сказал, что это «лучший масштаб». Возможно, есть лучшие способы сделать это, о которых я пока не знаю.
Дело в том, что объект String
будет использовать путь * на 1015 * меньше памяти, чем объект User
, поэтому вы можете иметь их больше. Это также более быстрый запрос и не имеет большого значения (выполнение запроса, затем сопоставление значений). О, и map
тоже займет больше времени.
Если вы используете Rails 2.3 ...
Тогда вам придется сконструировать SQL вручную, извините, чтобы сказать.
User.connection.select_values("SELECT email FROM users")
Просто приведу еще один пример помощников, которые предоставляет Rails 3.