0

whereクエリを使用して新しい配列を定義しようとしていますが、一方向でしか機能しません。

ここにあります:

<%   

 @children = Array.new
 Topic.where(breadcrumb_id: @topic.id).each do |y|
     @children.push(y.name)
 end


 return @children
 %>


 Returns the array ["Performance Arts", "Visual Arts", "Physical Arts", "Music", "Culinary Arts"] (All topics)

しかし、私はただやりたいです

  @children = Topic.where(breadcrumb_id: @topic.id)

  return @children.each.name

  Returns "undefined method `name' for #<Enumerator:0x007fe92205a1f0>"

何らかの理由で.eachは正しく応答しません...最初の例の最初のwhere呼び出しで機能しますが。違いは何ですか?

配列から直接名前を取得できるようにする方法はありますか?

4

3 に答える 3

3

それはまさにそうでeachはありません。map(またはそのエイリアス)を探している可能性があります。collect

Topic.where(...).map {|topic| topic.name}

Symbol#to_proc ショートカットを使用して、これを少し短くすることができます。

Topic.where(...).map &:name
于 2012-06-22T11:05:58.243 に答える
2

Rails 3.2には次のものもありpluckます:

@children = Topic.where(breadcrumb_id: @topic.id).pluck("name")

SELECT name FROM ...これには、代わりにa を実行するという追加の利点がありますSELECT *

于 2012-06-22T11:22:23.653 に答える
1

#where メソッドは、配列ではなくActiveRecord::Relationオブジェクトを返します。

配列を取得するには、その上で #all または #to_a を呼び出します。

@children = Topic.where(breadcrumb_id: @topic.id).all
@children = Topic.where(breadcrumb_id: @topic.id).to_a

反復するために配列に変換する必要はないことに注意してください。

#each の使用が機能しない理由に対する Frederick Cheung の回答を確認してください。

于 2012-06-22T10:57:48.447 に答える