W tej chwili robię coś takiego, aby wybrać jedną kolumnę danych:
points = Post.find_by_sql("select point from posts")
Następnie przekazując je do metody, chciałbym, aby moja metoda pozostała agnostyczna i teraz muszę wywoływać hash.point z mojej metody. Jak mogę szybko przekonwertować to na tablicę i przekazać zestaw danych do mojej metody, czy jest lepszy sposób?
ruby-on-rails
ruby
ruby-on-rails-3
franklin stine
źródło
źródło
Person.ids
.distinct
zamiastuniq
: takPerson.distinct.pluck(:role)
Powinieneś użyć
pluck
metody zgodnie z sugestią @alony. Jeśli utkniesz przed Railsami 3.2, możesz użyćselect
metody ActiveRecord razem zArray#map
:Post.select(:point).map(&:point) #=> ["foo", "bar", "baz"]
przed Rubim 1.9 musiałbyś to zrobić
.map{|x| x.title}
, ponieważSymbol#to_proc
(aliasowany przez jednoargumentowy&
operator) nie jest zdefiniowany we wcześniejszych wersjach Rubiego.źródło
Jeśli widzisz definicję select_values, to za pomocą „map (&: field_name)”
def select_values(arel, name = nil) result = select_rows(to_sql(arel), name) result.map { |v| v[0] } end
Typowy i ogólny sposób gromadzenia wszystkich wartości pól w tablicy przez Railsy wygląda następująco:
points = Post.all(:select => 'point').map(&:point)
źródło
Post.select(:point).limit(1)
wykonuje,SELECT point FROM "posts" LIMIT 1
aPost.all(:select => :point).limit(1)
podnosiNoMethodError
. Proszę popraw mnie jeżeli się mylę.points = Post.all.collect {|p| p.point}
źródło
select
instrukcja pobiera tylko określone kolumny.