Возвращать запрос ActiveRecord как переменную, не хеш - PullRequest
4 голосов
/ 28 июня 2010

Я делаю поиск ActiveRecord для модели как таковой

@foo = MyModel.find(:all, :select => 'year')

Как видите, из этого мне нужен только столбец года, поэтому мой идеальный вывод будет

["2008", "2009", "2010"]

Вместо этого я получаю хэш моделей, каждая из которых содержит год, как таковой:

[#<MyModel year: "2008">, #<MyModel year: "2009">, #<MyModel year: "2010">]

Я могу пройти через это как таковое, чтобы преобразовать его в мой идеальный вывод:

@years = []
for bar in @foo
    @years.push(bar.year)
end

но есть ли способ получить этот результат для начала? (т.е. без прохождения дополнительной обработки?). Если нет, каков более краткий способ сделать эту обработку?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 28 июня 2010

try:

@foo = MyModel.find(:all, :select => 'year').map(&:year)

Вы также можете вызвать .uniq() для результата, чтобы удалить дубликаты.

@foo = MyModel.find(:all, :select => 'year').map(&:year).uniq

Это краткая форма для

@foo = MyModel.find(:all, :select => 'year').map{ |model| model.year }

Это зацикливается на массиве MyModel и создает новый массив возвращаемых значений с помощью блока (model.year).

или даже более короткого кода, но сначала вызывает все из db:

@foo = MyModel.all.map(&:year)
1 голос
/ 29 июня 2010

Если вы не хотите создавать экземпляры моделей, вы должны сделать это следующим образом:

MyModel.connection.select_values("SELECT year FROM my_models")

Это вернет массив объектов String. Затем вы можете трансформироваться с помощью инструментов Ruby по своему усмотрению.

0 голосов
/ 28 июня 2010

Вы можете использовать map, чтобы изменить каждое значение в массиве.Пример:

@foo = MyModel.find(:all, :select => 'year').map { |model_object| model_object.year }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...