Как получить значения одного столбца в массив - PullRequest
77 голосов
/ 26 марта 2012

Сейчас я делаю что-то вроде этого, чтобы выбрать один столбец данных:

points = Post.find_by_sql("select point from posts")

Затем, передавая их методу, я бы хотел, чтобы мой метод оставался независимым, и теперь мне нужновызовите hash.point из моего метода.Как я могу быстро преобразовать это в массив и передать набор данных моему методу, или есть лучший способ?

Ответы [ 4 ]

182 голосов
/ 26 марта 2012

В Rails 3.2 есть метод срыва для этого

Точно так же:

Person.pluck(:id) # SELECT people.id FROM people
Person.pluck(:role).uniq # unique roles from array of people
Person.distinct.pluck(:role) # SELECT DISTINCT role FROM people SQL
Person.where(:confirmed => true).limit(5).pluck(:id)

Разница между уникальным и отличным

15 голосов
/ 26 марта 2012

Вы должны использовать метод pluck, как предложено @alony.Если вы застряли до Rails 3.2, вы можете использовать метод ActiveRecord select вместе с Array#map:

Post.select(:point).map(&:point)
#=> ["foo", "bar", "baz"] 

до Ruby 1.9, однако вам придется сделать .map{|x| x.title}, потому что Symbol#to_proc (с псевдонимом унарным оператором &) не определено в более ранних версиях Ruby.

5 голосов
/ 26 марта 2012

Если вы видите определение select_values, то оно использует 'map (&: field_name)'

  def select_values(arel, name = nil)
    result = select_rows(to_sql(arel), name)
    result.map { |v| v[0] }
  end

Обычный и общий способ Rails собрать все значения полей в массиве:

points = Post.all(:select => 'point').map(&:point)
2 голосов
/ 26 марта 2012
points = Post.all.collect {|p| p.point}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...