it-swarm.com.ru

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

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

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

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

77
franklin stine

В Rails 3.2 для этого есть метод pluck

Именно так:

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)

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

182
alony

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

15
Patrick Oscity

Если вы видите определение 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)
5
Vik
points = Post.all.collect {|p| p.point}
2
rajibchowdhury