web-dev-qa-db-ja.com

単一の列の値を配列に取得する方法

今、私はこのようなことをしてデータの単一の列を選択しています:

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

次に、それらをメソッドに渡すと、私のメソッドは不可知のままになり、メソッド内からhash.pointを呼び出す必要があります。これを配列にすばやく変換してデータセットをメソッドに渡すにはどうすればよいですか、それより良い方法はありますか?

77
franklin stine

Rails 3.2には pluck method があります

ちょうどこのような:

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)

niqとdistinctの違い

182
alony

@alonyが推奨するように、pluckメソッドを使用する必要があります。 Rails 3.2の前に立ち往生している場合、ActiveRecord selectメソッドとArray#map

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

before 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