Прямо сейчас я делаю что-то вроде этого, чтобы выбрать один столбец данных:
points = Post.find_by_sql("select point from posts")
Затем, передав их методу, я бы хотел, чтобы мой метод оставался агностическим, и теперь мне нужно вызывать hash.point из моего метода. Как я могу быстро преобразовать это в массив и передать набор данных моему методу, или есть способ лучше?
ruby-on-rails
ruby
ruby-on-rails-3
Франклин Стайн
источник
источник
Person.ids
.distinct
вместоuniq
: soPerson.distinct.pluck(:role)
Вы должны использовать
pluck
метод, предложенный @alony. Если вы застряли до Rails 3.2, вы можете использоватьselect
метод ActiveRecord вместе сArray#map
:Post.select(:point).map(&:point) #=> ["foo", "bar", "baz"]
до Ruby 1.9 вам пришлось бы это сделать
.map{|x| x.title}
, потому чтоSymbol#to_proc
(псевдоним унарного&
оператора) не определен в более ранних версиях Ruby.источник
Если вы видите определение 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)
источник
Post.select(:point).limit(1)
выполняет,SELECT point FROM "posts" LIMIT 1
аPost.all(:select => :point).limit(1)
повышаетNoMethodError
. Пожалуйста, поправьте меня, если я ошибаюсь.points = Post.all.collect {|p| p.point}
источник
select
оператор выбирает только указанные столбцы.