Как получить значения одного столбца в массив

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

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

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

Ответ 1

В Rails 3.2 существует метод pluck для этого

Точно так же:

Person.pluck(:id) # SELECT people.id FROM people
Person.uniq.pluck(:role) # SELECT DISTINCT role FROM people
Person.where(:confirmed => true).limit(5).pluck(:id)

Ответ 2

Вы должны использовать метод 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.

Ответ 3

Если вы видите определение 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)

Ответ 4

points = Post.all.collect {|p| p.point}